QQ登录

只需要一步,快速开始

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

    一、背景
    ) w8 M. l4 h- U/ o) y% K数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    ; S- [4 k! \# \! b  h- c#13 G3 u) j1 W. J8 U) }
    #展示数据集的结构
    . B) l1 d/ O+ b. |* Kdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")- @. @+ ~* N+ W* B  w5 Q
    str(data2) #显示的结果有一列是多余的,需要删除( q7 B; R- u/ T7 f* s( \
    data2 <- data2[,1:9]
    # p) I9 P- Y/ S- q- _" t& Q+ r; _str(data2) #删完之后的显示效果是正常的没有多余列
    / W5 z7 H1 S  _  n' x* K- C0 _9 m6 I$ g: j
    #2
    $ m. E; B' \2 V. G#显示前10条数据记录
    0 n( L1 ?/ N% N8 f' U! qdata2[1:10,]
    0 K/ ~# z% e* q; s+ R, M
    - V/ P. F' r7 B# m% S  b9 g#3+ L0 a  R9 P  H& a; E
    #将变量名重新命名为英文变量名
    9 Q/ n! J# H- V+ s* ycnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    3 b+ {$ m3 s3 k* C! Mcolnames(data2) <- cnames! w+ B" i7 D: h+ W
    View(data2)  q/ J2 r* |9 W& H* A# K; [
    ) p9 A8 l- O& u
    #4. U0 Q2 M( h7 c3 \2 `- N9 e
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录' d; b+ U" x9 {/ E7 Q$ s0 H0 F1 m: ?9 u
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))0 j- _" m& D( T4 p% |2 g
    #View(x2) #①先算出居住时间
    9 x' ]6 `! [; f  U7 z9 e$ S1 edata3 <- cbind(data2,x2)4 @& s, x- T, {! k5 G: M; }
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条1 K% ?  u+ P; C9 h8 n- v7 P
    list <- which(x2<=0): p& x/ O. @: v; T) x
    data3 <- data3[-list,]
    " ^) X' ]' I! t$ P+ M6 I6 KView(data3) #删除异常数据后是125条数据
    . E' L, q) T) A- E# L" F% p( ^- p+ g8 C1 d5 G1 b6 L7 c# y) t6 t
    #58 ?/ T' O1 M0 z/ Z. N* P
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。, S  \5 b' G8 A. q% Z' j9 E
    library(lubridate)( n% \3 `( f+ _) W( Q% }" _7 L
    date<-Sys.Date() #返回系统当前的时间1 n4 T4 a6 A/ ?# b! W6 i& A
    nowyear<-year(date) #提取年份# e" U! B1 D) _* l/ S  ]
    nowmonth<-month(date)  #提取月份
    * ^5 A% R: T: s. l5 R#View(date) #查看现在的日期. ^/ d/ K) w. U/ T# e. {( D1 P- K
    #View(month(date)) #查看现在日期中的月份% V& S5 ]( }& x* s; [
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))4 u( ]0 u* Y. ~
    for(i in c(1:nrow(data3)) ){; T0 w" F+ f& g/ T8 d
      if(nowmonth-data3[i,"birthmonth"]<0){/ ^: W" p5 [5 G$ e# N# ]
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1+ Y* ?  j4 z( Q
      }else{  c  h0 Q( e6 ?8 k. s* n6 k
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    * I- Q+ O6 M- \& \5 b4 x' p8 p+ i  }
    9 I$ p3 i# f* `3 K( m+ t: @}( _7 E( a( i* W1 h4 R. i% ]
    #View(x1) #算出年龄x1,并加入到数据表中& \0 q' @7 N1 f
    data4 <- cbind(data3,x1)
    % d6 L5 m- [# p  \" IView(data4) #加入x1年龄变量的新表展示# j' D* c; E8 {; E3 \+ }
    x2 <- data4$x2
    $ n: e" T! a* a( x3 k1 \- |Mean.x2 <- round(mean(x2),2)
    ' }" f! u' `( N# w2 [% d7 iMin.x2 <- round(min(x2),2)
    1 ^' r  f7 X: B0 O1 A! M* ?Max.x2 <- round(max(x2),2)
    6 n" n6 R- q* P; L9 bMedian.x2 <- round(median(x2),2)
    % y4 w/ ^% D3 M1 l# m) e2 o+ d/ Q8 sSd.x2 <- round(sd(x2),2)
    & T, g3 K, K& M3 F- M; g# u& xcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果$ W6 Y* @  y7 f  K& U/ F) b& _" J
    Mean.x1 <- round(mean(x1),2)7 D; M# A, M1 _6 z$ Y2 D
    Min.x1 <- round(min(x1),2)
    0 o, ^* `8 C. S$ U# p  w" `. YMax.x1 <- round(max(x1),2); N+ \5 B! ^6 W1 f8 q5 v
    Median.x1 <- round(median(x1),2)
      Q. D* w- ]% a6 L# g& I2 SSd.x1 <- round(sd(x1),2)
    , G% F& ]- f- \$ rcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果  ]' Q* b$ u2 d! Z4 ]* G: y; C
    x3 <- data4$friends
    * G6 ]9 ]) o2 Z! EMean.x3 <- round(mean(x3),2)8 D6 q% e3 w$ \9 w+ e
    Min.x3 <- round(min(x3),2)% ?, J* E7 ]/ G
    Max.x3 <- round(max(x3),2)
    8 o9 k; ]* L  R) [- Z7 FMedian.x3 <- round(median(x3),2)
    + ?+ |. U/ ]* V0 O; ~7 sSd.x3 <- round(sd(x3),2)6 P4 ?/ C2 y" C4 \2 W" e
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    1 d' l* M% R/ K3 Zy <- data4$salary
    ' `3 V! }' w/ f5 s1 b8 O. w+ ^Mean.y <- round(mean(y),2)
    / D* `- }, s/ [  |+ A' H5 e! }7 r" FMin.y <- round(min(y),2)
    : b, U0 F- ]8 I0 g1 v% h- _6 D$ gMax.y <- round(max(y),2)) T9 j7 r+ j( `: \
    Median.y <- round(median(y),2)
    0 t' Q3 h) k0 ^* oSd.y <- round(sd(y),2)
    & x& W8 B3 S. H4 ~cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    1 t3 q1 }7 L5 w( d0 Y8 f$ {* Y4 e8 }' @+ W' d' Q, Y
    #6
      h, p- E0 Q% k; N#计算数据集中因变量和自变量的相关系数,要求保留2位小数。/ W3 J9 o3 V- L
    round(cor(y,x1),2) #y和x1年龄! W; d- I% ^; l7 \, _* t+ j0 U' Y
    round(cor(y,x2),2) #y和x2居住时间2 K+ h2 X9 I% M
    round(cor(y,x3),2) #y和x3朋友数量
    ( K- c0 p* G6 u  j; y9 ~$ _3 }1 b- P% W
    #77 C8 J/ @2 n" B  \! S& o' W
    #分别绘制数据集中因变量与各个自变量的散点图
    ) K5 e/ Z0 t) C& X7 ppar(mfrow=c(1,3)) #布局,一行画3个图0 Z3 z  E( |, Q' @4 n
    plot(x1,y,xlab="年龄x1",ylab="工资y")3 D. V% H7 V! A# P* {
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    9 T' U; }7 |  k1 Z+ v  ]$ g/ e2 ~. |plot(x3,y,xlab="朋友数量x3",ylab="工资y")2 U! ^3 [5 k! b  Q& \3 G
    % F( C3 d6 g* ?8 v# m( K- \4 g# {
    #8
    # Z7 I6 G* R3 q6 y/ X/ I* @6 W+ m#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。" r# t5 L/ s; A- ]7 Y+ S- k
    lm.xy <- lm(y~x1+x2+x3)
    . h' l* o% ?! X. F* s" X" Elm.xy
    ' t, q' `" W5 c( `$ g; Z) I& w8 lsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    ( a# `9 \- \. b/ Q6 ~
    0 x5 D8 t/ `( n, W# R#9
    , x- {+ s5 y" W6 v#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    9 a, f+ W5 q5 l. k% `( \par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列8 ]; |- @3 b) E- Y, R% i, i
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布7 }# P1 X8 E4 G
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    . U' I% S" J' ^. a. H1 X#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。2 r2 T; t/ c! z9 i/ ^, `" ^
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。" H8 x, o& |! h0 m$ r  L
    plot(lm)
    # o* ?% h9 T) Wlibrary(carData)
    8 L- B9 Y- t( o5 }: e/ a+ v8 o: Rlibrary(car), k" h5 e( T9 a5 \5 `! T0 e9 Z
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点2 j2 A' R. J4 o  T& C3 ]( _* A. g

    3 T7 h* V4 Z/ s1 R1 k+ f0 K#10
      c1 k7 y, Q9 p6 ?#删除异常值记录后重新利用多元线性回归模型拟合数据。; e% Z+ e% ~5 |- n
    data4 <- data4[-136,] #删除该点' v' x1 _  H2 c! ?
    x1 <- data4$x1
    & H# ~0 W4 y2 u3 o0 {; P1 N! C8 hx2 <- data4$x2) x! h' S# t5 Y6 p
    x3 <- data4$friends! X$ i1 C* \3 C. b
    y <- data4$salary; q9 L! s9 [3 r$ I
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    ! q( J6 b- n4 p/ j% Dlm.xy2) p( G/ f% ]5 T5 s% G8 H6 d, D+ h
    # |/ i! z! R9 A
    #11
    $ L7 Y7 `' o: N% }, R9 ^" a#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。; u' P; G1 u$ O8 v9 G
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)1 K/ I; L9 p& U4 h
    1 b, C& s. ~0 i7 z6 D( q& S8 L
    #12" h( {5 k2 l0 z/ X
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    7 x6 n$ K/ i  ?8 _6 ]summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星/ }' p3 o5 e' Y4 P/ _  L- c

    ; G+ a9 g! P/ K2 M) r8 q**********************************************************************
      z1 M# }' f. g! c" z" Y4 C# L
    5 ~& R, U0 @4 m1 _) j二、利用多元线性回归模型预测收入/ N. ?* ~! {5 o$ z& l
    View(data4) #124条数据# }6 Q. X& g1 V
    #19 C9 r; f1 o9 ^, }6 A5 Z
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    3 h! h4 U$ ?" r* V: N! F! D* ^train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集+ S) F+ ]6 k7 m7 w5 c* [
    trainData <- data4[train0,] #训练数据$ k) p: v# i7 p; V; _
    testData <- data4[-train0,] #测试数据
    0 i  Q4 b9 `0 x6 B  G
    " ^# N1 k: D; j#2  k9 G5 G  y6 F1 {
    #针对训练集,利用多元线性回归模型拟合数据。$ [* p( A' j" _0 p" [( b
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    & r/ f5 r$ p$ k4 H% F; x8 L
    ' U# `0 k- Z) g/ v/ s; T: K. g#3
    % M" A8 u! `8 n' S8 a& N' F  E* M#对(2)中的多元线性回归模型进行诊断,处理异常值。* s2 s! y* r2 d( `2 V0 ]
    summary(lm.xy3): @( J. T5 k) g
    par(mfrow=c(2,2))
    4 x2 u( B; t4 N/ u1 v% K2 nplot(lm.xy3), M, V1 j) k/ j  M+ i( ?
    outlierTest(lm.xy3)/ D, X2 |) ?. l
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
      N/ P+ m) @  v% ]* R4 T- p
    & K% G" D5 A) k+ r, R6 y#4
    ) G; i+ k' \6 G#对(3)中的多元线性模型进行多重共线性检验并加以处理。5 Q. ~% y9 c7 q. E7 e- h( o2 Z; v* }/ l
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    & O4 Z  v" f- m6 K0 fsalary<-trainData[,"salary"] #引入的数据是训练集的数据& T! o" t8 D2 k$ O
    x2<-trainData[,"x2"]: {' p9 C+ k" D+ D6 q3 G9 e% ]
    x1<-trainData[,"x1"]
    ; j) [2 J2 E/ s2 c1 e1 U; ^friends<-trainData[,"friends"]
    + q* X9 c/ c1 A# Z) flm.xy3 <-lm(salary~x2+x1+friends)
    0 _; b8 P6 F9 Q1 ]! m+ o2 i4 I
    ( w6 P6 C4 C' {! @; W6 n#5
    5 O% u6 x& W( N0 ~7 L# j2 z- R; I, b  h#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    : V3 I- o4 s5 H6 t8 F#AIC检验,赤池信息准则,选择最小的
    # j$ O+ N- s! L& Q" w" }AIClm<-step(lm.xy3,direction="both"), Q  q, @* X% e, ]$ \6 R- h
    #BIC检验,贝叶斯信息准则,选择最小的
    - C0 R5 H. a2 Z7 x: V% rBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    & |4 E+ y9 c# s6 Y/ K' Z9 a+ |- c3 C* e" ^: r
    #6* P- C9 a8 G( w# s0 b, i
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    . P  @8 L. g" N) T$ z( y2 G% q4 g$ c#这三个模型预测的准确性大小,并进行解释。
    7 ^4 Y  r# t  b: f1 tAllmodel<-predict(lm.xy3,testData)
    6 B' ^. r, p  I  CAICmodel<-predict(AIClm,testData)
    & t# A4 a4 y2 |. g4 ZBICmodel<-predict(BIClm,testData)
    $ x0 J$ Z7 d. V$ D% Q#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    ; z2 x- B' d* V, ^4 Z#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    ) g2 N* g4 H. i8 x3 \% N0 U#标准误差能够很好地反映出测量的精密度( R- c) N  W! r) W4 s0 }
    MSE <- function(x){
    : C3 Q& h7 v0 W' Z  mse <- sum((testData[,"salary"]-x)^2)/50
    - d3 u* ~" O8 r% n' Y  return(mse)
    2 c7 K1 u9 D& T$ Q4 c0 v) s}4 N( T8 J: k, g8 y
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    : M+ V% s3 K! e1 ]MSE(BICmodel); c2 U& X+ N% q* [& D3 q5 ~
    MSE(Allmodel)
    7 c- N# L+ j0 N# Y( P
    3 F6 j: E+ q- R% v( f# V8 p  z& C) r" p6 I4 |+ I: C  l3 ]; G; f

    . B3 M: p2 X) k1 t5 a1 L) }4 f  v* L
    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-30 08:43 , Processed in 0.613296 second(s), 55 queries .

    回顶部