QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    . }$ H5 W* X- {1 h' h  |0 F& N#1, u  n  t0 t6 R0 o7 |6 p8 V
    #展示数据集的结构; @. x8 G$ F. X) h! P! {* ~6 A! ]
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    & g; Y% Y! `, q: Tstr(data2) #显示的结果有一列是多余的,需要删除
    * f/ c5 y1 }9 ~8 l, U' z+ o- Mdata2 <- data2[,1:9]
    % _# y8 K, q  Fstr(data2) #删完之后的显示效果是正常的没有多余列3 H% G$ i# z% `4 Z
    6 F8 v. m7 b, Z
    #2: t# B/ u/ m$ [) f/ v
    #显示前10条数据记录2 B7 L7 x7 J$ V6 ^" y# c
    data2[1:10,]
    9 ~3 o7 J3 ?$ U
      I8 M) S4 M4 c1 D3 Y* l4 p7 s" s#3
    3 O# [& D5 E- X7 e' Q8 ^#将变量名重新命名为英文变量名
    9 U- u3 [! J. ~/ x" hcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    9 ]- P- g. p; M& p6 Zcolnames(data2) <- cnames  B$ D" Y. Z; M
    View(data2)
    $ l+ @1 ]6 D# ?1 `6 x& L
    % T6 L1 ?0 V2 S#4
    + `) t. ?5 S0 G( G#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录0 N9 a6 P. N) n& S
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth)). d7 E; d1 P# _9 {7 w
    #View(x2) #①先算出居住时间
    / m7 d: M& O/ F5 B# ^data3 <- cbind(data2,x2)
    ( A/ E' ?4 ^2 _+ B2 ^! s#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    ) o  }" _9 E' @$ ?7 slist <- which(x2<=0)
    7 Z5 l7 M+ I: D% e) G( V% [; Ndata3 <- data3[-list,]  w9 H" {, j: I7 p
    View(data3) #删除异常数据后是125条数据
    7 k5 c1 v: L  j. z3 _
    ( k7 T. T: v) E  R#5
    6 U( h7 k+ I. B. s2 L' N; h#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    ( P; V: V# C3 olibrary(lubridate)
    & k- @( O3 a; ~% Ldate<-Sys.Date() #返回系统当前的时间
    ) b/ M' d% a) }% k. j3 b( Cnowyear<-year(date) #提取年份
    / }1 k6 e- M. R: W& Hnowmonth<-month(date)  #提取月份! V1 y" L8 Y" K+ O% E0 w+ n; W9 k
    #View(date) #查看现在的日期
    5 n8 S& I$ Q: R1 O, i#View(month(date)) #查看现在日期中的月份
    5 ?! o& R0 e  `, M# |x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))# P8 o  p) K  `8 ?( ]; F
    for(i in c(1:nrow(data3)) ){
    0 a% v8 S& c2 Y7 J* d  if(nowmonth-data3[i,"birthmonth"]<0){
    . {; `# t9 t& o  s' c) u3 Y' v  H     x1[i,1] <- nowyear-data3[i,"birthyear"]-1( O5 y" j) I& h& t& Z
      }else{) X/ }8 r. v" a' W9 h7 U
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    ) f2 l1 t9 z) z' C  }  y! i4 v; Y$ i
    }3 N/ S9 a; J) R8 N+ c
    #View(x1) #算出年龄x1,并加入到数据表中
    : _5 T$ M0 A& e" Q/ tdata4 <- cbind(data3,x1)
    1 V0 b% ]$ A  R' ~  ZView(data4) #加入x1年龄变量的新表展示+ @0 O4 j, q' p% c
    x2 <- data4$x2
    % J+ d# F9 Y/ EMean.x2 <- round(mean(x2),2)* _" j- I2 J8 }! r+ N& F2 n
    Min.x2 <- round(min(x2),2)
    ; h- [) O7 w- g1 I+ nMax.x2 <- round(max(x2),2)
    2 r2 T) M0 E/ ?0 T: P. b8 o" f0 kMedian.x2 <- round(median(x2),2)  W6 `# ^' R7 H! E: V
    Sd.x2 <- round(sd(x2),2)
    % K  j' m) ~5 W  acbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果$ t: ~: ?& \$ G# G/ ?
    Mean.x1 <- round(mean(x1),2). }/ G  [& g! D8 P5 U  |
    Min.x1 <- round(min(x1),2)
    5 O9 i9 F3 }& }* nMax.x1 <- round(max(x1),2), \( d6 V# Q! K7 N7 l1 R
    Median.x1 <- round(median(x1),2)* T- I" ^3 N+ O7 H, E6 h
    Sd.x1 <- round(sd(x1),2)8 K3 k' D9 c% A% ^/ v
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    3 f  x& X) }: \* A+ T! Jx3 <- data4$friends
    9 j2 K2 W( {. g/ T) eMean.x3 <- round(mean(x3),2)3 t6 T$ |4 s) x3 q
    Min.x3 <- round(min(x3),2)
    + C+ l% f' n: mMax.x3 <- round(max(x3),2)6 s! ?( s+ S. r8 j  w: J
    Median.x3 <- round(median(x3),2)( {' D3 k% l# _; w1 }8 Q
    Sd.x3 <- round(sd(x3),2)
    2 @9 [# s$ E6 S1 O" h2 A+ Scbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果0 T8 }/ o! P! {: f' J9 n
    y <- data4$salary
    : e- Y% k5 X. @' R, c, nMean.y <- round(mean(y),2)
      u* n% |3 S3 I. v) xMin.y <- round(min(y),2)
    8 m1 _4 V* f3 l* d+ g+ j' ]Max.y <- round(max(y),2)
    : o. b1 E0 P3 H$ n5 s6 b0 HMedian.y <- round(median(y),2)
    3 H( R# a# o! B7 DSd.y <- round(sd(y),2)
    ! ^; i/ c9 X5 r$ Q& Vcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果9 E6 r6 t" w. `
    # u3 m8 e3 @% \6 ~0 [8 K0 L
    #67 d1 a* a+ B8 H. ?
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    8 h$ B+ s' \  e) sround(cor(y,x1),2) #y和x1年龄: [) [4 ^, H0 ]1 l  s+ [6 R
    round(cor(y,x2),2) #y和x2居住时间3 H, I0 [: }& s6 `% h! y) L
    round(cor(y,x3),2) #y和x3朋友数量
    ( z5 ^) {( a8 n" K4 B- V/ R  j% A& N# ^) {- I, i% W6 z
    #7
    ) L# t5 K. f+ S: b/ s#分别绘制数据集中因变量与各个自变量的散点图2 Y, x, i1 m; E9 [  t& k) k
    par(mfrow=c(1,3)) #布局,一行画3个图3 M, l8 B3 J4 }7 d1 V! E3 a9 r$ w
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    $ {. e% d9 E* R! hplot(x2,y,xlab="居住时间x2",ylab="工资y"), f3 ~& d8 {) y; \' v* ^% _
    plot(x3,y,xlab="朋友数量x3",ylab="工资y"), J" @' V% u0 I1 n6 _

    2 P6 `% H, B# t#8
    8 y9 _( F3 ]% o! Q1 e#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    3 _( [  w6 u' d8 B. wlm.xy <- lm(y~x1+x2+x3)
    4 L( s1 {5 q# Rlm.xy
    , L1 u' J3 X4 v6 I. Y: b" }# Ssummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    7 [2 m' z6 l5 u. w
    " T1 H' {4 h: j2 Z1 b' h; v, M' R  T#9& a" ?' ^$ m( T" M6 @* l2 `
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。  U  e  z; U8 w0 L8 C6 \. i- F. x
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列8 f3 c. d+ [$ @( N8 G8 _
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    " j5 a. [) P( v  e: w4 B0 G#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。* m/ u1 V  L/ p9 Z( n, V
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    4 X3 X" l" C' Z6 C5 L#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。" M( r( R* j) W6 R7 L7 g/ t  l  J# N
    plot(lm)% r9 L8 R# W8 b
    library(carData)
    6 Y" O3 S1 \; s/ q6 U8 Nlibrary(car)1 y) G+ P: z& r: w2 g/ k
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点8 y: ~0 H: R5 S: h+ M" n& e7 a$ b

    * N4 _, q+ B* m5 T6 O. d: J#100 D2 {9 {6 N1 {* N2 P
    #删除异常值记录后重新利用多元线性回归模型拟合数据。# e( V+ |) S) O" \! V* z
    data4 <- data4[-136,] #删除该点1 c3 ?* u; Y$ B7 f
    x1 <- data4$x1
    ; t3 @: h; U( dx2 <- data4$x2
    % I* O: {; [5 h9 zx3 <- data4$friends  G1 o' `* C3 f# D' N
    y <- data4$salary
    " n8 A! t+ ]4 q8 Mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    : V1 H3 x0 G) L% \+ ]/ r; {lm.xy2
    ' T9 @; Y0 D; [8 M" w: L
      ], J' {7 w0 X* i: b" j1 \% L' J3 |#11
    - {0 t. A" \/ {. i0 T' t+ t#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。3 z( }* T# O9 x' u/ M
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    0 x0 f# H* W* P* Q9 W  K9 t
    . ~( a) }& l6 y! e& O* a0 s! F#12. R5 G' [" U0 L7 |# T( a
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    0 w4 f8 ]1 {6 ^- q- w. Ksummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    : U) H% f2 K( f" c' u* ?' \. f; k* j, E9 L9 H; u
    **********************************************************************# f  t8 [# V/ ~' n

    * a, v/ w" n% Y) T. N8 T二、利用多元线性回归模型预测收入! G0 O. q: P6 A6 C5 s  [- B
    View(data4) #124条数据- b. W* H5 l. p5 G
    #1
    + h- g1 M) N6 ~# B$ W$ m#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    ; d. ?* M% f; {1 w# }& ptrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    4 X7 z  l! X6 X( StrainData <- data4[train0,] #训练数据
      m  H3 }3 W) F5 l0 M, d$ wtestData <- data4[-train0,] #测试数据
    3 g+ a  C$ x1 a3 a9 I  K. E: c6 f/ U9 D4 `1 i, ?
    #28 Y8 |: _% k+ _) H& F
    #针对训练集,利用多元线性回归模型拟合数据。; g' g% H8 I2 a% }2 I: M" }
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    5 o2 H. T" A3 s, Q" A5 K3 M8 P. T' Y( u) {
    #3% m4 H* h7 x1 H
    #对(2)中的多元线性回归模型进行诊断,处理异常值。+ Z5 M9 x) L$ ]$ H4 g  H
    summary(lm.xy3)6 J/ l- c$ N1 j7 ?' W; d
    par(mfrow=c(2,2))
    $ S/ u) O* r: e3 Z' J3 K! v- L8 Tplot(lm.xy3)
    9 G  p. {2 }. B5 Y# ?6 OoutlierTest(lm.xy3)1 T! o4 X% g7 N) q7 [8 c6 N
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    9 U  Q7 G) k3 q
    4 \! P6 T* F7 m- z, E3 e! ^/ b; ?#4
    + j5 J5 L0 r$ ?4 {; }7 V! U% \#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    1 z0 O) J$ [5 ^vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    : g1 W5 a9 E/ I+ @$ o# e. fsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    ! D: f# H# @; J0 J1 y' y0 Jx2<-trainData[,"x2"]
    / y2 b5 ?) F7 z7 ~7 {! Wx1<-trainData[,"x1"]
    ! o# N& h$ c5 |, g# x/ N6 w' sfriends<-trainData[,"friends"]
    % G/ h$ Z( N! h5 jlm.xy3 <-lm(salary~x2+x1+friends)
    5 a" k4 j) \+ K5 w5 v3 {0 v
    % \4 l% J" i3 y% k. W; u#5
    ; C! A" q) J. f#针对(4)中的模型,分别利用AIC和BIC选择最优模型。* o$ _4 c8 f3 g5 `
    #AIC检验,赤池信息准则,选择最小的
    6 z' a" O4 f* Q) v6 @& ?4 G. CAIClm<-step(lm.xy3,direction="both")
    ) ]9 b: U. r0 O7 J: g) z#BIC检验,贝叶斯信息准则,选择最小的5 z$ U8 \" }9 g- X" ?2 y5 z
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ) o' p6 B/ {5 J: X) ?7 Q
    / S$ ?3 A2 V7 d# `( k: k#6$ O) E) H7 z3 @2 Q( g
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型1 W% T, G1 u- H
    #这三个模型预测的准确性大小,并进行解释。
    9 x; b0 ^( m- n6 H. s6 cAllmodel<-predict(lm.xy3,testData)
    2 B: ^5 s5 o+ u. V7 Y* I- XAICmodel<-predict(AIClm,testData)
    2 z6 D6 J5 @7 ]5 vBICmodel<-predict(BIClm,testData)
    5 y. ^7 [* T* b; }; u#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    " b# q; T4 z, _2 B% o#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, C1 g7 ^7 v4 F& |
    #标准误差能够很好地反映出测量的精密度7 L' S" y% d' A; b+ g
    MSE <- function(x){8 |- w" Q* [3 Q$ h( \
      mse <- sum((testData[,"salary"]-x)^2)/50! S+ `2 |0 o; _" x
      return(mse)$ p  a2 z3 Z" J. ^7 U& `8 r: J
    }
    ) D- Y$ O& w1 N- C  UMSE(AICmodel) #AIC/BIC/ALL是误差最小的. C( ^, B& A( u" ]! Y& B
    MSE(BICmodel)
    $ W1 |. p% K6 ~" hMSE(Allmodel)
      G9 \8 ]/ c$ Q. M& Z+ X8 \/ B$ h- f7 L) W) H' ~

    4 S' N5 B/ e+ |. H- |0 m% m  F% s
    ( L3 p5 z' y% \. L2 t' t
    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-5-25 18:49 , Processed in 0.283376 second(s), 56 queries .

    回顶部