QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3600|回复: 1
打印 上一主题 下一主题

【高级数理统计R语言学习】2 多元线性回归

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 11:44 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    【高级数理统计R语言学习】2 多元线性回归

    一、背景2 }. d' _5 X+ z" N4 U; f& e
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    8 h* I' W3 D" P8 _# G% d#1
    # ^- y& J' D! f8 l3 Z2 o#展示数据集的结构7 J/ k2 c, U+ x! }; c& i& M  U3 X
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    7 s1 X& H, }' d  E" cstr(data2) #显示的结果有一列是多余的,需要删除- i  u$ d. f/ A; U
    data2 <- data2[,1:9]5 z- q; ?2 D! ?
    str(data2) #删完之后的显示效果是正常的没有多余列
    9 r4 d( D/ l% Y! u* q2 h% G  P7 P4 N2 ^8 d+ _- J
    #2
    $ j! l' E1 g6 ^+ m5 }#显示前10条数据记录8 A% @7 n7 b$ M  O; t0 H
    data2[1:10,]
    , Y, h+ L) _) E) A1 I3 q: t- s; d- S6 i' }& R/ \8 p7 c
    #37 ^8 e7 X" T% `, Y, ~
    #将变量名重新命名为英文变量名
    7 I7 |9 z$ t( |: F! P3 V' l* Tcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    / p2 R* ^3 I1 v4 s5 T( t. Scolnames(data2) <- cnames  q! r6 |; o. \# {& }
    View(data2)
    % [9 z6 A3 H9 M" w4 y1 \3 S1 y! E0 O) C0 k
    #4- ]) a( i4 D7 F4 T
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录! i8 c$ ?% _3 c/ W6 g
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    7 O" d7 L) ~& v* K#View(x2) #①先算出居住时间
    ( Q: e# ^- f+ P8 O3 r$ N# Kdata3 <- cbind(data2,x2)
    % [6 G. m. Y. y2 O1 L' n6 e8 q#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    2 |+ h/ e, b2 z( Ylist <- which(x2<=0)
    2 M1 V; g. `2 V# j  J& ^2 Hdata3 <- data3[-list,]
    ) I9 P; S6 S* m9 o; N! {1 xView(data3) #删除异常数据后是125条数据2 `6 V* H: K& H$ Q1 F$ K
    % h8 ?  p0 t+ B3 D4 L& }
    #56 M( n* q# Y" J* o% w
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    , B; K+ j4 C+ |) E9 Qlibrary(lubridate)6 B. P; \. w- ~- i+ c3 @7 Q0 f* D
    date<-Sys.Date() #返回系统当前的时间1 X7 P* N0 P, q5 P3 ]8 U
    nowyear<-year(date) #提取年份
    ! J  V  Y- W) o( \& h+ cnowmonth<-month(date)  #提取月份, G1 j- s# r; p# N( S* v$ E
    #View(date) #查看现在的日期
    + v% J1 I+ L8 Z. s* v; `+ w#View(month(date)) #查看现在日期中的月份0 P4 B9 j! g. D, [2 R( V( \5 V
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))2 e' S7 i/ o) @& g8 r
    for(i in c(1:nrow(data3)) ){
    4 J+ b# M  J. N1 d; n8 |  if(nowmonth-data3[i,"birthmonth"]<0){
    3 @6 Y* }0 N: a0 [# S* k# e' f/ O, k/ ~     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
      q2 _* |8 V) s! G2 o  }else{1 ]0 u, W+ {" n( B( Q/ ?3 j
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    2 n& {3 d0 f' U. k. p% S  }# h2 w  S& K; J- r" m* l: c
    }
    4 d' X& [1 N  _0 `8 e0 J2 d, {#View(x1) #算出年龄x1,并加入到数据表中$ Q" x+ r: T; m5 ~' @! }3 ]% P
    data4 <- cbind(data3,x1)
    - f! M8 {: b1 o4 ~View(data4) #加入x1年龄变量的新表展示4 _* ?( q6 Q) q4 m1 q
    x2 <- data4$x2
    + \4 M$ s8 B" C) O/ BMean.x2 <- round(mean(x2),2); e' b+ d; |. p$ R6 f8 f
    Min.x2 <- round(min(x2),2)% j5 g7 x) q% y! z& K
    Max.x2 <- round(max(x2),2)( Y- x# X2 z6 f+ H1 Y
    Median.x2 <- round(median(x2),2)8 H* F( o3 E9 r4 A1 @( l
    Sd.x2 <- round(sd(x2),2): ?( k% r# M7 F1 Y; w
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    # t0 j! ?, G: i6 {Mean.x1 <- round(mean(x1),2)
    + p6 u5 c6 W" F7 b7 z: E8 SMin.x1 <- round(min(x1),2)
    & ]; v9 l$ L  W- r& H4 EMax.x1 <- round(max(x1),2)4 F  _, M7 r* H" n" m: W: u
    Median.x1 <- round(median(x1),2)
    2 z) [5 t/ P' J; N; g2 y' D( I2 `$ tSd.x1 <- round(sd(x1),2); a& G7 D* I; x: \( m
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果5 I1 @) {# o* I8 p) x! g
    x3 <- data4$friends
    & `# [. T1 I9 M; i& |, x6 X# m; S3 mMean.x3 <- round(mean(x3),2)
    7 a0 E4 r7 |5 M! I( ?Min.x3 <- round(min(x3),2)
    & J* K+ \. {% n, y0 R9 gMax.x3 <- round(max(x3),2)
    9 t! }  a3 X% M$ y# oMedian.x3 <- round(median(x3),2)% G0 V+ y, h! ?4 p
    Sd.x3 <- round(sd(x3),2)
    + k$ O- `$ M( x$ K4 Q4 Hcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    # O" d0 t0 W/ ^& Dy <- data4$salary
    6 s! i4 u* C  s" B7 B, a$ b) nMean.y <- round(mean(y),2)& T4 e" i# N( R4 i( V, v( g2 q" }
    Min.y <- round(min(y),2)' m) V/ U# g+ {) }  X/ _& H
    Max.y <- round(max(y),2)# e; C+ q$ j& ~) {$ D$ h
    Median.y <- round(median(y),2)
    ! g$ t; k! L. O8 N0 S7 n5 w: dSd.y <- round(sd(y),2)% N* e% J$ H! L( ~5 p; D2 S% n  N
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    - G) V( A0 D% z; y
    ) k% Z& @( x2 d  \. m#6" t7 ~3 ?9 H- z( Z
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。7 N8 u" w  W: w- @9 {& F
    round(cor(y,x1),2) #y和x1年龄
    ! @5 j, z0 Z% d5 ~round(cor(y,x2),2) #y和x2居住时间' n9 p! H+ w0 y2 h
    round(cor(y,x3),2) #y和x3朋友数量
    7 L* m" U9 V4 k0 ?/ R, K" c* [  d
    ' U2 b  [  G- c( H7 l/ Z#7
    ) F( G7 l. x1 N' [#分别绘制数据集中因变量与各个自变量的散点图
    8 a) G: l7 y8 B: ~) Qpar(mfrow=c(1,3)) #布局,一行画3个图( x: @! x, p4 s( Q! h
    plot(x1,y,xlab="年龄x1",ylab="工资y")9 i3 ^7 m8 l: F% d
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    1 I( y- R) [2 r* }3 nplot(x3,y,xlab="朋友数量x3",ylab="工资y"), u  m1 T$ n! r7 k6 \( M1 X

    , d. c- t( ]+ @% \1 o#8
    . m6 o/ t  }! |6 v9 a$ {6 v#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    " f* J) }  ]2 U6 C. q6 dlm.xy <- lm(y~x1+x2+x3)
    " n. s/ A, L6 |$ Flm.xy
    3 Z1 n" z4 B# B0 [summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的4 t6 m( v( W" R. I. M+ B
    ! P8 R6 h4 m% E9 ~
    #9
    + K* S7 Q9 ^+ S6 `, j5 `#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    1 v* b  v& p/ ?, u4 J' qpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    4 u3 w1 w' `( g8 `( Z; c* C#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布& a( \& x% \6 B
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。8 q2 P4 A& \$ S/ s# W) s
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。8 U+ ~0 F4 G# H) @" B, d. g
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
      b. Y( X7 M; o+ {9 \plot(lm)
    % H! k! T! \0 |& ]" ^1 Elibrary(carData)
    6 K, z- [$ F6 C  H' n. alibrary(car)8 P/ z5 Z' r4 ~5 w
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    $ I  P- Q7 Y; }- y- g7 b8 t4 A4 _+ |- Z. f" `
    #109 m% @2 O, K0 Q3 P- q) ]
    #删除异常值记录后重新利用多元线性回归模型拟合数据。0 l8 n+ g' {' B* S& z) R
    data4 <- data4[-136,] #删除该点7 w! X/ ^7 _& V/ w
    x1 <- data4$x1
    7 S4 ]! E  S' U+ S; sx2 <- data4$x2
    7 k0 i" G! T% t0 w0 B$ r4 p: Wx3 <- data4$friends& R4 }/ n& i% r( y
    y <- data4$salary( K% y' i$ T2 u6 a4 N5 _8 s+ d
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型( t0 [. r7 }, o2 K5 i# c( Q
    lm.xy2
    + ]  P5 z# C! }: z
    # n- l7 Y5 b7 Q% E( [7 T#11/ Y% y( G3 E2 ~$ g
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    5 F! ^  W6 u) Hvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)9 {- G- H* M% D( }5 E; N; w
    6 P) V% h1 z" }5 a
    #127 |* o; Z' W$ R9 R1 R* q
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。. L3 M+ m/ `+ f" k, G
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    . w" W" @) @! D4 t7 p# |5 f7 `$ |  u4 ~# N1 \
    **********************************************************************
    , w& @1 V, m$ r6 p
    7 }8 T- S8 T1 j1 _  |1 Q' F: Q二、利用多元线性回归模型预测收入+ ^( i$ b) R1 d' N1 {8 u% V/ e1 |
    View(data4) #124条数据
    7 j! N4 k! J* J, ~- i& Z! F& q#1/ d' C$ S, B6 [. q) d) J
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。7 {- f2 v9 m5 q; z
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    0 e% {8 J9 A  j$ ?trainData <- data4[train0,] #训练数据# U, x( J( T3 U$ b+ s$ R
    testData <- data4[-train0,] #测试数据
    " Y4 V' V+ E- ?9 h8 {% Z
    7 P' d  _5 v8 Z2 U! o  ]$ O#2
    $ o. N9 K/ J3 Z! k( r#针对训练集,利用多元线性回归模型拟合数据。
    " {' Q$ r. W' O; Z% X3 slm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])! y, ~1 r3 b% d) p# }+ E3 a7 F
    * t4 h9 B/ f8 t" ?4 s1 D* H
    #3
    : D" h# e# y. `- e5 X#对(2)中的多元线性回归模型进行诊断,处理异常值。
    ) s- O( z3 g* U) m6 W5 C6 f2 j, |summary(lm.xy3)
    ( x$ P& [3 V5 w; A+ T1 K3 R/ Vpar(mfrow=c(2,2)); U8 L# \, x! u  E
    plot(lm.xy3)
      U5 y; P2 [5 _0 @* @0 p4 ~! toutlierTest(lm.xy3)! e8 |& t( R6 o7 C, g1 E; p
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的4 S( K0 y- B6 e' q

    ; J7 k1 {+ ~& x: ~( u2 t#4
    0 y4 |5 a; G2 A# y# e) `0 v#对(3)中的多元线性模型进行多重共线性检验并加以处理。. f7 Q. i/ F& T* a, E" j+ o# c( A
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)  w$ m* h6 s6 B! m- ?, D* j/ S
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    : X- z. r5 \# K( T" V# L0 |/ mx2<-trainData[,"x2"]
    " N% h) F# F2 q  Hx1<-trainData[,"x1"]+ R. a; x! W. H& y# b: Q& Y% y
    friends<-trainData[,"friends"]
    6 z# c7 C1 ?( o- ]9 Ylm.xy3 <-lm(salary~x2+x1+friends)
    , A  {" b8 R( [) A4 ]( R+ t
    5 }: O9 A: P2 x#5
      S) P: B$ B( i, \; n) \; F# j! c#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    $ V# Z( j; N  F* w' `: M6 H#AIC检验,赤池信息准则,选择最小的, m% h7 L4 ?# X: t* b: `
    AIClm<-step(lm.xy3,direction="both")+ x; C! n. C) _9 X
    #BIC检验,贝叶斯信息准则,选择最小的
    9 e2 P+ b" B& xBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")  I$ E3 s& B* a' |/ [5 o
      O; S& h# k* V4 d
    #61 L/ L: E' v' O* o
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    * L1 \+ y" ]) R+ a#这三个模型预测的准确性大小,并进行解释。, X% m$ N  w" l! L, L
    Allmodel<-predict(lm.xy3,testData)* m! H( v: a) a7 n
    AICmodel<-predict(AIClm,testData)
    " y) W1 a+ o% {, G' TBICmodel<-predict(BIClm,testData)0 C, l2 L% |7 i8 g
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
      E' c' M9 Q# |- u; R#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根) V/ S- f5 L: t( T! f2 S
    #标准误差能够很好地反映出测量的精密度0 N- |+ ^) w0 N: l, [
    MSE <- function(x){
    . d4 O/ M" m+ I( T7 R$ b7 Q  mse <- sum((testData[,"salary"]-x)^2)/503 r2 o! l/ E8 U5 c, b5 _
      return(mse)
    & i2 ?; I4 V: c9 u+ Y) J$ U3 \3 x6 ]}- Z# W* B0 ]9 v2 |- N
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的* _  `3 b9 Z! [2 Q" I
    MSE(BICmodel)$ N5 |3 S) j, d
    MSE(Allmodel)$ c/ \% Q7 _. q$ Z+ D3 T2 t. K
    & O/ n: f. M; \% Y

      M; x* K6 w) m; o. l, x) e0 S( D
    4 V% H6 f* P: a+ _- ^
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    试试吧        

    0

    主题

    1

    听众

    4

    积分

    升级  80%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-23 08:07 , Processed in 0.314117 second(s), 55 queries .

    回顶部