QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3610|回复: 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 多元线性回归

    一、背景  b* ]5 ]6 s; `# l! w2 f" ]- z
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素6 L& }/ h8 N: }+ m
    #1
    & W1 K& K6 O/ u/ m8 U#展示数据集的结构: b' q5 e* |1 r. w3 \
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=","), R4 N* Y; i( R- S5 f4 W. k3 o
    str(data2) #显示的结果有一列是多余的,需要删除
    # M: @! B! l( k7 U  k, ndata2 <- data2[,1:9]0 y- `& R& P2 d' p/ A: Q
    str(data2) #删完之后的显示效果是正常的没有多余列6 C4 j8 f' @7 A4 x5 j" [9 A7 N
    $ }4 D/ r! U/ o5 g8 ?
    #2; C- L. w+ ~- g3 ^6 P' d& ]/ f- E7 N) v
    #显示前10条数据记录
    ! x. K  q, i$ u+ b! U( Q. jdata2[1:10,]- V# C! M3 O" ]- ?: V

    / f2 e' Y# W- l1 J#32 x6 m: f" w! p# D0 m. J- @
    #将变量名重新命名为英文变量名
    4 F% C3 o  s; d' `+ tcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    1 Z4 m& |( H; I; k6 acolnames(data2) <- cnames( f9 J# h3 D& x9 @& {
    View(data2)+ D3 ?. M5 x# c' R3 E% T6 [
    + c* l( p. m' C% G% `) l
    #4+ [* ]1 a  L2 k" }2 d/ P/ U
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    ( X2 u9 b, K. yx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    8 l  E" `8 O+ D% k  Z9 \6 h#View(x2) #①先算出居住时间; C' \- t7 x' R0 [* p0 T
    data3 <- cbind(data2,x2)  L9 y% q" M3 `4 C! S% }9 O' Z
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    6 o0 K2 d0 E& e7 }5 O' w( n% dlist <- which(x2<=0)
    $ C% h- Q# j/ n: A+ T! Vdata3 <- data3[-list,]
    ' `6 M, }' v3 [: k4 t  l& ?View(data3) #删除异常数据后是125条数据$ S' c9 U; f3 P, K1 p
    0 ^! N6 m! r9 U4 R
    #55 Y) ^4 m( z/ X7 p) v3 c
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。1 a4 R/ N0 x6 B& `% f: q( G
    library(lubridate)8 R# T6 `# q% q, @( P1 X
    date<-Sys.Date() #返回系统当前的时间
    2 c+ S  n; w2 C4 v8 anowyear<-year(date) #提取年份
    7 i. `! u6 C: i7 Q; I2 lnowmonth<-month(date)  #提取月份
    # A) e4 L" H* l) z; ~' A#View(date) #查看现在的日期/ l5 n1 ?' H) K
    #View(month(date)) #查看现在日期中的月份
    ) o$ y7 z7 D3 k- q* e, Tx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))+ {+ z! r: Q* B+ p6 B3 r
    for(i in c(1:nrow(data3)) ){
    + Z! F% H, q9 n  if(nowmonth-data3[i,"birthmonth"]<0){
    & C, L$ s3 [" E2 u     x1[i,1] <- nowyear-data3[i,"birthyear"]-1, O6 U( T# S0 k4 D8 S- v
      }else{+ H3 x0 u3 P8 h' r0 j2 G( Z7 Y
         x1[i,1] <- nowyear-data3[i,"birthyear"]. H; P) v5 r4 r1 [7 R, M. X! H
      }  S4 g) _# T! M  q  o" f( V2 B
    }
    , ~: ~/ d* C! a1 n/ T4 o+ \9 Q( w6 e#View(x1) #算出年龄x1,并加入到数据表中
    , U9 U% H8 C1 d( J1 qdata4 <- cbind(data3,x1)
    2 k7 y- w3 o5 u( U/ Y8 }; IView(data4) #加入x1年龄变量的新表展示
    " N7 W8 S3 N$ @9 h6 e  \' Kx2 <- data4$x2( s/ f" E0 W& j9 P  H
    Mean.x2 <- round(mean(x2),2)+ o! F  |. Z8 J6 j0 V' M$ m
    Min.x2 <- round(min(x2),2)
    6 a0 @6 n$ ^" g' i8 M0 y8 JMax.x2 <- round(max(x2),2)
    % l! B- d% ]3 m) z0 t- [7 LMedian.x2 <- round(median(x2),2)
    % P! ]. m1 q: aSd.x2 <- round(sd(x2),2)9 h8 E* v" t/ W0 o
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    . R0 Q9 S2 e' a/ n* w- F, |Mean.x1 <- round(mean(x1),2)( z, W% @/ r" o1 ~* Q5 k! u
    Min.x1 <- round(min(x1),2)
    & s- n% Z3 x* ZMax.x1 <- round(max(x1),2)9 T. L9 b" s+ y4 w( j
    Median.x1 <- round(median(x1),2)- A5 V. y3 B( M; S
    Sd.x1 <- round(sd(x1),2). [* R2 ^2 b- G: x
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果4 x: E1 D  {, L
    x3 <- data4$friends
    * [. W3 E1 G% e5 X# F" @Mean.x3 <- round(mean(x3),2)2 Y& `; b$ K' G2 M+ W# W, l
    Min.x3 <- round(min(x3),2); Y; F) _8 |" `+ E
    Max.x3 <- round(max(x3),2)
    " M! S% @- z5 f9 T5 k' RMedian.x3 <- round(median(x3),2); A/ [3 q6 R! I% d
    Sd.x3 <- round(sd(x3),2)5 I* m( C- M4 ?8 W& a
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果/ U/ s- J* c9 r  @- S$ T+ O! j% h
    y <- data4$salary
    4 o( m+ m! P$ u, l$ u7 dMean.y <- round(mean(y),2)6 ?1 {! Q. x6 o# J' X
    Min.y <- round(min(y),2), ~5 y3 m+ I  X" x. `
    Max.y <- round(max(y),2)7 ]0 t0 Q  K( p( v9 f- `) K! I
    Median.y <- round(median(y),2)
    ! K, F* A- r, A+ ^3 BSd.y <- round(sd(y),2)8 G1 p$ ]( R* @2 c
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    8 [* D3 R: t% H. P5 I/ }1 L7 G5 @  I5 c3 l; b+ t4 G1 \# B
    #65 @! n; s) }, Z! h" G
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。/ n7 ]! ]5 N8 }. k' x
    round(cor(y,x1),2) #y和x1年龄
    ' `( ?* W8 |: L% o0 l, L+ @- M; Yround(cor(y,x2),2) #y和x2居住时间; F; I2 e' `* O2 Q
    round(cor(y,x3),2) #y和x3朋友数量
    ( M( F8 i# l% j1 u- M7 _
    + ]' Y8 k) l% o0 G#7
    ( ~3 n9 P. M; A! z* |1 X#分别绘制数据集中因变量与各个自变量的散点图
    $ ?( r+ I! q  ppar(mfrow=c(1,3)) #布局,一行画3个图. d1 y# ?" p* _! W3 C
    plot(x1,y,xlab="年龄x1",ylab="工资y")! g, K* R; }* f) I! T& t/ W- M
    plot(x2,y,xlab="居住时间x2",ylab="工资y")3 d$ u" m) J9 o
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    * {9 B$ g* ^* M
    $ c# N" _# B6 K7 F#8
    , b$ G( e5 o1 e& h8 l( Q: M& h#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    : H; d, n4 n. }4 f9 g' [/ Z) nlm.xy <- lm(y~x1+x2+x3)( x5 K* G! g8 I9 v- `  q# O
    lm.xy
    , e1 v9 a1 U0 Q; H$ a- k0 Fsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的* B+ _+ C6 H: K6 u$ K

    " i$ Q$ |. o' Y  u1 y#9$ y) {  \! O/ ~# D' F2 A/ a2 g9 Z6 c
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。- c( L; D! A5 {9 Q' l# ?
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列$ x: j" X5 G/ a- @% d3 J/ B8 q
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布' K) }+ ^# Z. N# t5 f6 A0 T2 |4 s
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。) a/ k7 R9 b8 ]1 B6 a9 a' {
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    8 {, u( W: N# P' U% w. [#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。, _  @4 h6 ]& r+ r+ x% z: {! K
    plot(lm)
    6 o' j7 ^# F7 x+ O2 olibrary(carData)/ @; b% Q, f$ X/ b& o/ L
    library(car)/ Y1 J3 p; Q' H# Q- c6 u
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点1 X  Y8 z! Q. w6 H9 t- d
    1 d9 Q' m7 @; E) z3 D
    #10. n3 i, j! i% ~. z
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    8 z5 i2 e/ |6 K+ W# jdata4 <- data4[-136,] #删除该点
    * j$ Y$ `% u: A) @( U8 g6 jx1 <- data4$x1
    + \1 W' T2 F) J9 z7 \$ o  ?- ?3 _. Jx2 <- data4$x2
    $ X2 E( p" j# M/ q' g6 k9 Kx3 <- data4$friends
    , T7 D+ [) }5 `5 F1 C6 q5 ny <- data4$salary
    0 U9 _$ v" L/ \- J3 ]7 R% ?! u4 `. Jlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型7 Q0 q/ k- e1 Y  v6 N# i9 i
    lm.xy2
    - Q- s" i( s% c' Y% p2 y3 f2 A# s- m
    #11( b* k2 U- m& l/ C0 t
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。, N- s+ `' O) Q0 K2 {
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
      X( M  s; y% W; h
    . a5 d* Q2 O6 _4 }#12
    ; r7 l) R" ]  Q#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    . B0 [8 |# k8 `1 d6 I2 O/ p5 i' Bsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星0 Q1 X0 B8 V. U! d5 F

    . X# m' ?- F+ r3 r& J**********************************************************************
    3 \: ]' f3 q0 P. o. _( z+ c
    - i0 s- T# ]* G" x# e( R8 L* x二、利用多元线性回归模型预测收入
    3 R& j$ Q0 r5 y5 j. xView(data4) #124条数据- f2 b; t8 j, Z7 M) S0 v3 |. i0 E
    #1
    $ j7 |0 [8 P( J6 _) x; k#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。/ K( e1 q! x! I+ y, H. O% [
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集9 H0 [, E5 U$ u7 t$ Q! j
    trainData <- data4[train0,] #训练数据
    0 j; [) |: s3 k% b- E7 K3 k& jtestData <- data4[-train0,] #测试数据' r" p5 S6 b+ }$ ?" m* g' j, B- }
    9 C( E/ x3 i) \( V! t5 D% Y7 K( w- \
    #2
    ' C4 C; D: a) I( C' J#针对训练集,利用多元线性回归模型拟合数据。0 o2 ~  S& m" b) m# p+ s9 P$ p
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    4 V: ~! Y' o' f3 _0 S7 ~$ D) u' R4 ]0 j; l$ r
    #3: C( N+ f0 p- H
    #对(2)中的多元线性回归模型进行诊断,处理异常值。! s; u) L1 i+ P; i0 c5 m  L
    summary(lm.xy3)
    1 v2 X" y2 Z+ C+ }7 Lpar(mfrow=c(2,2))' m! G3 k6 m, J0 V" \* I+ Q
    plot(lm.xy3)
    ! b' D& _% B0 M4 V; `( DoutlierTest(lm.xy3)% l2 ^( L- x1 V# j' b6 j
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的/ O7 ]) Q; y9 O- u  S1 E

    + C) J4 Q4 b8 i6 D$ L#4
    : H( L7 n* p0 S2 ]1 J#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    % q' Z- H$ d! @vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    . b" C/ d0 w9 c7 G# I3 ksalary<-trainData[,"salary"] #引入的数据是训练集的数据
    1 r6 c. `* ^- w  c* ?8 Cx2<-trainData[,"x2"]$ F/ @6 _; N; ^1 a6 U
    x1<-trainData[,"x1"]
      Q9 r% A7 [; d* n! X/ u: _friends<-trainData[,"friends"]  g4 ]: K' d( M5 w+ m7 y5 s/ s
    lm.xy3 <-lm(salary~x2+x1+friends)
    ; B6 C/ @& j  z' L
    ! _' ~, Q- V& V7 |; Z, M9 A#57 |; j& |, O3 {" Y1 d7 M$ m  ^
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    ! q- P) \' }, G8 ^4 B#AIC检验,赤池信息准则,选择最小的; ]5 h1 ?, g6 x# A! q  u
    AIClm<-step(lm.xy3,direction="both")
    7 T0 O2 C- A) r/ T9 {+ P8 _#BIC检验,贝叶斯信息准则,选择最小的, V% p  c9 u9 r3 I9 l. Q
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")3 V' W4 V' X( q1 i" p  D

    # L& T  i5 t$ P' c#6. P! Y" G/ L  Z+ L6 I, ?6 ^
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    8 e3 k* A% j! A- r# B0 N: R  m#这三个模型预测的准确性大小,并进行解释。/ q7 S. C  g  c$ L7 ?
    Allmodel<-predict(lm.xy3,testData)
    5 ^+ W4 V/ E; d  ^AICmodel<-predict(AIClm,testData)8 D' j/ T; X  `. L
    BICmodel<-predict(BIClm,testData)
    5 r4 h* _1 ^+ y1 O% n0 s#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差) ~# R- i2 d' F7 _1 N4 U
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    ; S8 s: v& T% J# y  J' r#标准误差能够很好地反映出测量的精密度' F" T- e3 E, ?! Y5 X: S$ w, f
    MSE <- function(x){# {; x! J6 Y7 ^5 n6 O
      mse <- sum((testData[,"salary"]-x)^2)/50* n1 j  W/ o- O$ d2 o" O; x
      return(mse)
    , W: w  L: I* m! C5 w}, W) r. I  q& N
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的; p. }1 C4 @8 ~: p( h. n' g
    MSE(BICmodel)
    / C% K. K; I8 l2 iMSE(Allmodel)
    & }+ E6 d) S9 F& Z) k6 u$ ?5 L3 |& e' J9 X2 A6 o
    - p/ G# T4 G/ ^1 e* D' B
    1 b: V8 u2 Y. Y- o* E/ o
    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-27 09:19 , Processed in 0.569454 second(s), 56 queries .

    回顶部