QQ登录

只需要一步,快速开始

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

    一、背景
    " K0 W8 p+ Y' F! y& a$ H; m数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    * u& F) `$ u" O1 }5 P5 V#1
    % O/ E0 z2 `5 v: V; J/ p0 b( t#展示数据集的结构* y1 r) y0 S8 O5 a9 K- @% z  L
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    9 O4 M# g" H/ tstr(data2) #显示的结果有一列是多余的,需要删除  l' S+ P3 f1 @8 W9 X' d
    data2 <- data2[,1:9]
    . a+ Q; P6 Y) cstr(data2) #删完之后的显示效果是正常的没有多余列  u/ w. h5 b- ~' r* \5 b% c
    - f$ H  K# ~3 h  c4 |- E! w3 j
    #28 _1 x" ^+ G6 x
    #显示前10条数据记录
    4 r0 u4 G/ o$ gdata2[1:10,]
    5 ~5 J. M) g% ^9 `/ W9 ]+ L* ~5 F! v$ U& m. m2 {3 M8 f, M. Q& [
    #39 G9 y2 j; {: e3 i
    #将变量名重新命名为英文变量名' W4 Y/ y2 K2 Q# Y" c  S
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    1 X. E: ~  `$ t3 W% U. S- Mcolnames(data2) <- cnames/ I" }5 n+ c7 O9 V" U5 A
    View(data2)
    5 F' s# u8 l9 M, B# k7 |. V$ X7 w2 e" B* R$ C' J7 x0 W
    #4: N& k, k" c6 s
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    $ k2 q6 v5 ]( v/ Y' q' Xx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    0 T  l* Y3 R5 ?7 T% P8 _) x#View(x2) #①先算出居住时间
    ( `0 Z1 Z& e) G# r; hdata3 <- cbind(data2,x2)
    1 H) A& a# x: i#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条% {  U, p3 T! f# t. o& ]
    list <- which(x2<=0)
    , l, A8 ~) E1 u$ A9 f3 L; w$ [data3 <- data3[-list,]
    5 }$ s# A5 l( L$ Q% z2 A5 gView(data3) #删除异常数据后是125条数据1 Q2 v- U/ A' ~2 C

    . R9 j- V. u; i2 b#52 R! ?$ H4 g/ ^* I: A' [& L
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    2 C! ^$ q/ d+ \8 h+ K4 Rlibrary(lubridate), ]) s, l8 O7 D1 v/ x* l  A
    date<-Sys.Date() #返回系统当前的时间
    + m# I6 @* @) b. Bnowyear<-year(date) #提取年份
    . z0 |# ]6 Z8 e+ l+ G2 N0 S4 mnowmonth<-month(date)  #提取月份
    " s" I& R$ R$ `$ B#View(date) #查看现在的日期# P. d5 Q! C1 u& S
    #View(month(date)) #查看现在日期中的月份! ]9 E) e* ~* u5 C4 R/ o: V5 D
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    ) K- G3 O3 Z% x- L( f' I% Afor(i in c(1:nrow(data3)) ){
    : P( [# c5 {& F! o  if(nowmonth-data3[i,"birthmonth"]<0){' G! D$ y& k$ Q0 n6 v' j1 k$ K9 I3 z
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
      f6 I# P3 k! u! v( K1 f$ g$ z  }else{  h  c- w7 B' A$ u7 ~1 d0 v
         x1[i,1] <- nowyear-data3[i,"birthyear"]8 b/ ]. s, K  s- F! C. @
      }
      A- @0 R, G0 G5 W}
    * j" [9 x& |" B# `4 ]( Y0 S+ I# ]#View(x1) #算出年龄x1,并加入到数据表中- p7 x  Z: B# Q6 k6 J. V
    data4 <- cbind(data3,x1)
    8 n$ P! W- O" T# SView(data4) #加入x1年龄变量的新表展示3 b+ ]: X. J( u( Q9 @
    x2 <- data4$x2' c3 T8 ?8 Y- k7 H; V7 y  r6 o
    Mean.x2 <- round(mean(x2),2)9 F  A! x! M# b  p! n1 c5 [/ j/ ~& m
    Min.x2 <- round(min(x2),2)
    . J4 T/ ^7 ^% X9 M, F4 wMax.x2 <- round(max(x2),2)' Z0 I) `4 V) H0 ^& H4 g
    Median.x2 <- round(median(x2),2)1 \/ V0 s% X9 T/ P3 g% ^8 w& H
    Sd.x2 <- round(sd(x2),2)
    5 P" c; @2 |& s; v; ycbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果2 B9 H- k. J+ {
    Mean.x1 <- round(mean(x1),2). k' `& s1 n1 _  k8 a$ D* P5 v* ^
    Min.x1 <- round(min(x1),2)
    6 k) \% J# }$ @Max.x1 <- round(max(x1),2)1 i7 r: @: T, e! `
    Median.x1 <- round(median(x1),2)3 _7 W& b7 Z* g4 X& \" a
    Sd.x1 <- round(sd(x1),2)" x2 t, r% g' c0 B9 E) Q
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果) y5 D6 e/ D' f, F* W( B
    x3 <- data4$friends' f9 K1 ~2 U6 t# [) o
    Mean.x3 <- round(mean(x3),2)
    " S2 ?$ V6 W& |0 x0 [Min.x3 <- round(min(x3),2)) _* |- h! Y" l0 q$ ]
    Max.x3 <- round(max(x3),2)
    - U" d/ u) ?5 D7 W! T% Y6 mMedian.x3 <- round(median(x3),2)  e  ^1 M  q# ^
    Sd.x3 <- round(sd(x3),2)
    # x$ {: r! e% H0 _' y: acbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    8 U2 P. t. c( n; z- K1 Dy <- data4$salary* f( p1 E7 b& m
    Mean.y <- round(mean(y),2)1 y0 j3 l& l; ^/ h4 ~4 e, I2 j; Z
    Min.y <- round(min(y),2)
    3 w' L! L% |' t8 S; M6 CMax.y <- round(max(y),2). \1 |& T5 x  H" b) q
    Median.y <- round(median(y),2): F9 E; G. `) y9 Q* B5 e
    Sd.y <- round(sd(y),2)
    ; n8 \1 v$ V% X: A6 |( Pcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果# t% A: Y' h( `9 y
    9 a; u$ p! Z* ^+ C" }1 r
    #6
    5 E% A* |5 {& j" U( z% @4 z#计算数据集中因变量和自变量的相关系数,要求保留2位小数。0 n4 L+ ]+ q, d. v# a2 F; W
    round(cor(y,x1),2) #y和x1年龄
    + [/ ~( @( H3 d% D& Mround(cor(y,x2),2) #y和x2居住时间
    , Z0 x8 ?- f4 r: k; \" ]round(cor(y,x3),2) #y和x3朋友数量
    : t; |. S) ]' r; {  e; B) u  V- Z
    #7
      z  R& Q" v; G3 @: d2 P5 i' I#分别绘制数据集中因变量与各个自变量的散点图" u4 @, W" i# _* ]( a( {8 @
    par(mfrow=c(1,3)) #布局,一行画3个图
    4 V5 E" r4 u; bplot(x1,y,xlab="年龄x1",ylab="工资y")
    & w, @/ y/ b! V5 D# Qplot(x2,y,xlab="居住时间x2",ylab="工资y")! {; I9 }( N+ K
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    / Y3 P: R5 C6 q' W- M
    0 e; y  T3 g  N; W! M% Z#8
    - Z" @! C& o7 `% ^. r) t#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。1 \- u$ o" [! J/ U5 H
    lm.xy <- lm(y~x1+x2+x3)8 U# i& E( Z' \+ c
    lm.xy4 h/ D% S- m  P6 F; m
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的4 M- Y8 N' J$ \1 r. H* x9 h3 O0 H

    3 s' D8 w7 Y. k#9- d0 s, v: [+ T' Q7 V( K
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    ! X- t# F( k# Y7 f) G9 Rpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    ! w8 j  f  x) d/ E. T; K#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布. B* X' G3 X2 X3 }! {  _
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。+ o) _3 {- s  K/ T
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    8 U8 V2 d$ N7 h) e' ~#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。& E% ]- O( W+ I+ T
    plot(lm). P6 ]1 K7 G9 B1 O1 S  [
    library(carData)
    $ C  U; ?% G  u8 Qlibrary(car): {4 R8 B; S9 h9 {
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    7 P- U5 k3 Y! ^0 b3 _. I6 {& k* d' G3 n# L2 V' |" g3 ^; G& \, r
    #10. c7 O. H, x% m' ~# E( ]# h% x
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    % i$ ^$ A# e  k) C" E$ m& }data4 <- data4[-136,] #删除该点
    * f0 m! j$ m+ Mx1 <- data4$x19 Z9 {" }0 A) A& q& c
    x2 <- data4$x2; p( F, v7 X7 @/ L
    x3 <- data4$friends
    ) N0 I: _, Y& D' xy <- data4$salary
    & m4 S  H8 o- s7 blm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    ; [( R- n5 `0 W4 ]* o# u: a! g) t9 flm.xy2+ [7 w3 D. t# f- f  [) p! Q/ e% y& h+ m
    ! M, f1 i$ Z: R7 R
    #11! K! P) }7 ]3 p" {$ z. m& V
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。* X+ O6 g$ I4 A" J
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
      L' o+ d0 [; Q5 }, R3 g- C
    ; i6 ~- Z& I+ q7 o  r+ E#12* ]* a% m/ V. A5 \- F
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    / r. G9 m/ A( P  P( csummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    5 I. W, W9 N& F% o3 e: Y5 z% y4 G1 ~, r# a" \# q
    **********************************************************************) s' ^6 u( ?7 B( @. ?0 C0 i
    * Y9 O, t6 Z& T9 Y2 r/ [2 r8 k
    二、利用多元线性回归模型预测收入- G+ }% P8 U, X$ i
    View(data4) #124条数据
    ! E- L4 g- }! O- D* C#1
    2 X) t2 G) E' f( ?# r#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。9 H+ y) J6 }  a
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集6 m" D8 E) k$ l
    trainData <- data4[train0,] #训练数据- _& Z7 s% F5 C
    testData <- data4[-train0,] #测试数据+ J' ?2 w6 i$ E6 Q' H
    0 S3 Z3 T6 v* ^( D9 P
    #2
    9 n1 h) Q8 B5 Z8 C: m#针对训练集,利用多元线性回归模型拟合数据。
    $ o5 @! Z8 [3 Q, @lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])$ n. J2 Q" j  m6 g) ^7 p. y

    & V! i0 A& w: G+ z- _#3
    . {6 Q9 E/ Y! \+ [; T7 V#对(2)中的多元线性回归模型进行诊断,处理异常值。  u( k* ^1 U& I; E& T8 F5 k
    summary(lm.xy3)* g) J1 v& L; n8 Z/ U% T
    par(mfrow=c(2,2))
    * g8 m" `- c# h2 ~plot(lm.xy3)
    7 a7 z6 ^2 f, x: RoutlierTest(lm.xy3)) w- `7 r( c; G5 n8 b( _! a
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的& ~& ?: O& K6 i
    . O  ~) }  S8 x
    #40 R8 c, C. p; X4 S4 S* q+ C1 _
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    9 Q# m+ l! i, x) I3 r. }% [* C! Ivif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    9 q( {0 K% I0 h& D8 L1 Q+ W1 Qsalary<-trainData[,"salary"] #引入的数据是训练集的数据0 T$ `4 K) a: s- p" J
    x2<-trainData[,"x2"]
    * r- V* S! Q$ z: px1<-trainData[,"x1"]
    ! U* _$ l3 _8 |, D6 B4 b: K+ s1 ]friends<-trainData[,"friends"]4 f' z  Y1 W% T- Q4 H( E+ S8 ^
    lm.xy3 <-lm(salary~x2+x1+friends)
    1 [3 r; K6 Y8 h4 b( Z& B$ K; h  y" B7 s, @
    #5  N& ~4 t& ?( o* k5 z7 l
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。" J( B6 t: p' V! r
    #AIC检验,赤池信息准则,选择最小的, i, Z$ [2 T4 `7 F* T
    AIClm<-step(lm.xy3,direction="both")3 x/ e/ U  D6 R& w
    #BIC检验,贝叶斯信息准则,选择最小的; t2 q+ B4 G' {! u( L  i8 g5 L( ^
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    2 \$ G1 Y7 X% K  F2 n/ C( n
    5 \( G' m% G9 \. O! |#6# |, F6 d$ E5 S
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型4 L* }  N& ~/ E5 E; m5 ]8 P
    #这三个模型预测的准确性大小,并进行解释。; b# e9 \# ~. M" h' S/ l; H' c3 K
    Allmodel<-predict(lm.xy3,testData)& S4 [2 H: X' t
    AICmodel<-predict(AIClm,testData)% J& e9 @$ x$ L9 p& C
    BICmodel<-predict(BIClm,testData)# \) i! ~' c3 }5 ?
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差7 s1 \: S3 D3 `6 E  K% {; k
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    # q4 D$ D1 w6 s! I. F" z7 @2 S3 {8 l9 C#标准误差能够很好地反映出测量的精密度$ D& B5 \4 m6 T6 t+ s" l
    MSE <- function(x){
    1 `" [9 S( U1 I+ I' c( N, b  mse <- sum((testData[,"salary"]-x)^2)/50! K* g' x3 V0 U! H
      return(mse)
    ; [3 |- Z! {3 a- E1 C8 I: A}. N% l4 e4 I* k, T4 O( V
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的  H* `: m7 C/ k- i4 H
    MSE(BICmodel)* S& _; A( i9 G. |2 _
    MSE(Allmodel)
    # A# p+ i9 A6 r) W1 |
    ) C1 ?" _; x( O4 i) z, d7 y  K  t- S9 N$ [- Y
    : S; [* m5 U. h$ o2 F1 Z, E! G
    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-7-10 20:08 , Processed in 0.350731 second(s), 56 queries .

    回顶部