QQ登录

只需要一步,快速开始

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

    一、背景
    8 z1 H0 @* U  k0 m4 ?  V数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素3 J+ W! A/ Q/ e( [5 ^; l
    #14 w) r- \- w7 F3 y4 N
    #展示数据集的结构4 p* P4 ]; F- \4 j8 G
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")* H2 Y- `0 q; Q5 j  [" s4 Z
    str(data2) #显示的结果有一列是多余的,需要删除
    8 g. A7 a, k( `! g# e8 W- zdata2 <- data2[,1:9]
    3 a1 R! n+ O# ^3 k( o) M$ V, Mstr(data2) #删完之后的显示效果是正常的没有多余列9 w- c. g0 A% @* K" \) f8 b) m
    + w1 _3 a$ Y  ~
    #2
    / V" e# R- G' }' Z- s; r4 G& ]6 h* g#显示前10条数据记录
    2 C/ G  R. j% I# K, {data2[1:10,]" K4 a. M' _* [+ G

    , N3 E6 U, J6 Y. ~' d: d#3
    ! d& T1 f( q+ I6 Y5 n9 ~' H( P#将变量名重新命名为英文变量名. o/ D% O) t% H* a' {
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")9 I$ F6 ?0 x3 H& X9 w0 m
    colnames(data2) <- cnames
    3 ]! g+ S, a- u3 FView(data2)
    , e: b9 `, ^* M; J) C9 Q# J  H) Q" v! a! Y* F
    #4
    6 W. M/ H7 e. S) l) D#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录( n5 }: g- W( t3 T; c- A
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))3 J4 @; N7 f, ~: F
    #View(x2) #①先算出居住时间6 P$ L- e6 l+ w& d3 U
    data3 <- cbind(data2,x2)
    - P2 H- i, Q8 J3 o3 T1 ]#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    . s- E" ~+ \. `2 c* i( k; Plist <- which(x2<=0)
    # `# g7 |3 m) Z- Gdata3 <- data3[-list,]
    . V9 [1 ]  m3 ^4 t6 }7 ZView(data3) #删除异常数据后是125条数据
    ( |  k# Q! x9 v5 }; l
    & A) f! }+ f4 K! N$ t  T#55 Y/ n5 p5 ?& g2 F; Z; _; D
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    , B$ H) n5 V7 y+ xlibrary(lubridate)
    3 v* r$ B* i% P/ }8 Tdate<-Sys.Date() #返回系统当前的时间
    ! u4 T+ G: w8 Z# M4 j5 D9 Inowyear<-year(date) #提取年份
    ( X4 x; l  G: S. m: Inowmonth<-month(date)  #提取月份
    1 C( n4 y  ?8 e, s6 h( L& _#View(date) #查看现在的日期7 E. w6 c& p0 w) T0 Y0 b& Y* w
    #View(month(date)) #查看现在日期中的月份
    - N% p0 Z& c; |3 Ux1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    1 _& [/ t6 n( K' f! G- R. gfor(i in c(1:nrow(data3)) ){
    $ z9 F8 g) j$ G: [" b( q0 ^9 A  if(nowmonth-data3[i,"birthmonth"]<0){- `9 [/ k- N7 e3 l9 N
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    , b3 [* S0 y/ R0 R2 ~+ U  y  ^  }else{
    - r) z: v3 {& B; k& S     x1[i,1] <- nowyear-data3[i,"birthyear"]
    3 [8 j2 K+ C- v" s4 l  }& w. d( _- l5 b- J3 ^
    }
    & z8 i2 m* X. L! [1 [* U$ {  {' U#View(x1) #算出年龄x1,并加入到数据表中$ \8 e; U; O' F7 w. ^
    data4 <- cbind(data3,x1)
    1 W6 X$ p3 d& N# uView(data4) #加入x1年龄变量的新表展示1 U/ z7 a* o5 u% n/ O
    x2 <- data4$x2
    7 e! \# H  h3 ?Mean.x2 <- round(mean(x2),2)
    1 }- h5 K8 f; {- X8 f' _Min.x2 <- round(min(x2),2)8 h1 T! J  [4 p  P8 ]
    Max.x2 <- round(max(x2),2)5 J( B7 _' ]- y
    Median.x2 <- round(median(x2),2)
    0 X" i8 B7 k: ASd.x2 <- round(sd(x2),2)# O, }9 a) N& z9 Z: t
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    8 y& t9 ^. J, v; t* N) sMean.x1 <- round(mean(x1),2)
    4 V% s4 Z% ]2 [0 t# M! g# UMin.x1 <- round(min(x1),2)
    3 P9 _( X9 Y1 x. \, gMax.x1 <- round(max(x1),2)9 v& E- _. S( P, I& h; F0 s+ g8 r
    Median.x1 <- round(median(x1),2)6 G9 X- u8 z7 N' J3 N  o  L
    Sd.x1 <- round(sd(x1),2)6 t" F% Q; y9 f$ `" o- j
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果8 }1 E: w4 }$ l4 m
    x3 <- data4$friends0 f5 M" H" l2 n5 [8 I
    Mean.x3 <- round(mean(x3),2)8 M/ m  a& K, X5 P
    Min.x3 <- round(min(x3),2)% V' x$ R+ r. y' V* }
    Max.x3 <- round(max(x3),2)
    $ \; E5 y" c2 aMedian.x3 <- round(median(x3),2)
    3 X0 J  z1 i1 k( e7 @8 ~Sd.x3 <- round(sd(x3),2)
    & `& ^- R2 K; H; B& b& ycbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果1 x7 u3 T. y; J0 }
    y <- data4$salary
    * ~: w) d* z" h5 b. jMean.y <- round(mean(y),2)% _& Z* x& Q8 G7 \, s6 A0 w* m
    Min.y <- round(min(y),2)
      S3 ^6 f) c- A$ r& l. M' YMax.y <- round(max(y),2)2 |; M' p0 B( ?, [
    Median.y <- round(median(y),2)6 e. j$ R& R. u4 ?" x9 _
    Sd.y <- round(sd(y),2)
    7 x1 e, ~7 R4 ~  k4 z' i$ |cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    + o% [. i, B5 B. }! ]
    1 w; u' O4 m. E5 a4 E/ ^#6+ ^$ a- n, r1 ]
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。8 g: e% f/ ]9 p; y+ Q7 T
    round(cor(y,x1),2) #y和x1年龄1 d# h" ~6 r% {- k* o, i5 f
    round(cor(y,x2),2) #y和x2居住时间+ g* J# n( H$ N/ E4 ?7 R( }
    round(cor(y,x3),2) #y和x3朋友数量
    9 M; ]/ S8 W% j0 C* S5 Q$ ?. J( ~& g
    #7  f* j; @7 ~7 F9 D
    #分别绘制数据集中因变量与各个自变量的散点图
    * F* H- H' m1 epar(mfrow=c(1,3)) #布局,一行画3个图
    7 j. e% Q4 U* H9 rplot(x1,y,xlab="年龄x1",ylab="工资y")3 S6 ]; V* @& F! U
    plot(x2,y,xlab="居住时间x2",ylab="工资y")2 \0 l, M1 i# Z/ I9 J! n
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    0 l4 z/ N/ M6 h5 b$ U) j& A% m- M5 N/ b( G3 I0 i" U& L% n4 V
    #8
    $ J7 l& Q0 n% A, q#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。# t' s& K5 H- w6 }2 {7 C& b' H1 `
    lm.xy <- lm(y~x1+x2+x3)
    7 [9 k* b/ j3 M% y( h) b+ L5 Dlm.xy1 m# i* a* O6 v/ ]' Y: \0 P
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的' t- q% M5 p! ~* E6 H

    - ~% r: a/ e: z* Y" Y#9
    / s" I/ v! U% R8 o) _: l2 Y! i- P' w#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    * b/ _* \& p' g5 U& W: \par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列4 E& J; w% x% V/ k
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布, [. W, s  j; z, E+ D& ^  Q7 w9 e
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    - ^* w9 K  Y0 K4 @4 \#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。5 q3 L3 ?8 ^' U. q( Q
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。8 U) J. m+ }, O6 k( Q
    plot(lm)- o) R% W5 M* @+ K
    library(carData)
    ( Y3 G6 T! _2 z- [4 C; s1 dlibrary(car)
    & ~7 y! y, O/ goutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点, J# E6 A8 M& H% ]
    , r' v' Q, l0 v' |, z: W( n2 T
    #10
    7 K) E$ J) K, U#删除异常值记录后重新利用多元线性回归模型拟合数据。5 @3 f- x; r/ _% k0 y* F
    data4 <- data4[-136,] #删除该点
    * s7 ^4 z8 V. s! r. Q, px1 <- data4$x1
    + p' f" i6 c; ~" p% c2 i' Vx2 <- data4$x2
    * m  ^8 I8 m4 X6 U* Zx3 <- data4$friends( W, s3 r; l; V9 J* n  q2 v
    y <- data4$salary# v5 n7 n) [) ^, |
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型5 b9 D( `8 P# [3 o- ?& S$ H
    lm.xy25 y) E3 E- H) d, u! g( Z* e/ Y

    ) {5 ?/ q; v0 O: E3 [+ v#11/ L/ ^; O9 N: |
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ( w) z9 }0 o. P9 S) C' ?, A+ lvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    : i- `9 E6 d1 f4 ?+ K4 `$ x: I' {9 E6 o# x; X# k7 J9 N+ `4 l! ~
    #12
    * ^6 y+ [3 C, l, E4 x: v; w& j#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    . R+ \6 D/ |7 X5 O" c  n8 }' dsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星! c, i5 [/ H# P& j8 Y" k) u1 R

    / d$ T3 @* r6 [  H2 m# Z" W' q**********************************************************************/ M- _  u* B& a5 d

    % ?  T# ^; p$ {6 ^+ D二、利用多元线性回归模型预测收入/ ^5 n. l/ A1 X
    View(data4) #124条数据8 P; w+ f4 Y% T8 {3 R
    #1
    0 c' C* {% _, Y" ]4 w#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    & z% B. c/ W  j3 A# n8 g6 Ptrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集* @; N9 E* x  t* l8 D# Z
    trainData <- data4[train0,] #训练数据
    : X* i' [8 a# _( i+ E6 D4 ^testData <- data4[-train0,] #测试数据
    ; N: `, u  r: `% j3 y2 f3 f9 w0 M, C' t7 }8 m& i
    #2" m1 O" E* q8 B9 X% o1 W4 W  k/ N
    #针对训练集,利用多元线性回归模型拟合数据。
    3 A7 F" ~3 t5 U% b3 ]4 g: W  k2 slm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    ; C6 u& Q2 z5 M9 S) \; x4 C2 V8 \. u& f8 ~1 c& v4 V  h8 _
    #3
    9 W" |, _1 r$ x9 d7 q( A  j#对(2)中的多元线性回归模型进行诊断,处理异常值。
    ; ]3 C4 i/ M2 g: `4 V: I  D( |summary(lm.xy3)
    ' h- P$ H! b! j% Xpar(mfrow=c(2,2)): j8 D& o- R! a
    plot(lm.xy3)) z) p0 p; T% W$ W
    outlierTest(lm.xy3)
    1 M  z$ T  a9 J$ n8 KtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    " u" _; I* D, I2 ^/ E) y4 a3 o; F" H& N# E/ ]; A* c( m/ Q
    #4
    ( R9 U4 F9 ~7 a. a( b- f#对(3)中的多元线性模型进行多重共线性检验并加以处理。/ B3 f5 J/ l, N" L7 Z8 Y
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)3 {& `. z9 h6 Z2 J' g
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    2 v' @/ X! W1 l$ x3 C9 i  \; _- Sx2<-trainData[,"x2"]0 f, _3 w, R) {4 s1 G/ l4 r
    x1<-trainData[,"x1"]
    , D3 ]& P5 ]: w- V4 ^8 T, X) h  Qfriends<-trainData[,"friends"]/ v! C) O$ `2 f- t
    lm.xy3 <-lm(salary~x2+x1+friends)( Q, Q8 h& y; N4 [: Z  _' z1 g7 s

    7 `2 w6 B0 @) k4 d) A#5
    ( g; m/ W' u2 \. G2 c6 U#针对(4)中的模型,分别利用AIC和BIC选择最优模型。2 q2 }  d; H: x( c% L# ?. x
    #AIC检验,赤池信息准则,选择最小的
    $ E' R+ O# ^4 {- S% x9 |AIClm<-step(lm.xy3,direction="both")- G6 o5 h+ n! \. d, Y
    #BIC检验,贝叶斯信息准则,选择最小的' \- u3 ^8 p& ^
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    : K! ~* Z8 T9 h4 l
    ( s' |; V8 w4 K6 u' U#6
    ( Z$ G; X. |# m' j( y" y) \#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    . e1 t5 m6 H% I, y3 v6 T7 a#这三个模型预测的准确性大小,并进行解释。
    7 a" j- v8 X$ Y# X  m2 c# p: VAllmodel<-predict(lm.xy3,testData)
    / C' h: s4 I1 t. ~AICmodel<-predict(AIClm,testData)4 d- J7 y) S  b3 v- `) W
    BICmodel<-predict(BIClm,testData)- [3 k- W6 r! \
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差3 q1 E( S: o1 S2 W) y6 L  j
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根& }' f% L+ }' N2 w, _6 N
    #标准误差能够很好地反映出测量的精密度. }# n$ \9 b3 T1 P& m. v0 C0 W  n
    MSE <- function(x){0 @- F9 m3 l6 z7 g2 u+ e
      mse <- sum((testData[,"salary"]-x)^2)/50: e( {6 Y/ w* w$ e
      return(mse)) w9 {4 S. ~5 D0 M1 e
    }
    % A" f; `( C% s# \- ^7 D( DMSE(AICmodel) #AIC/BIC/ALL是误差最小的6 x+ k7 b" u9 ]7 l
    MSE(BICmodel). k6 L2 E; [" r( }! {  X- f
    MSE(Allmodel)& w$ Z' M5 B7 J& s+ }0 h" r

    ' F6 ]. q! N8 q% a5 R5 e+ c! i3 Z; Z3 B& X6 S
    2 s: u" _* ]: 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, 2025-10-3 12:47 , Processed in 0.351846 second(s), 55 queries .

    回顶部