QQ登录

只需要一步,快速开始

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

    一、背景
    - j2 o+ b# c6 \0 o# _/ o, T, k数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素+ Q* G/ q7 d. i* c# _3 M
    #1# L& Y0 w- L% Q) [, n5 D8 K
    #展示数据集的结构4 [( o8 E( x* e
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=","), h1 C' E+ G1 W! T5 V1 U; E6 P$ H. ?
    str(data2) #显示的结果有一列是多余的,需要删除  V# ?0 N* O3 I3 }) ]7 p5 e
    data2 <- data2[,1:9]5 @: @: w/ C  H8 b
    str(data2) #删完之后的显示效果是正常的没有多余列
    ' V) x( l  D$ e9 j3 i2 l& m" b/ i* K# I5 N2 K9 P3 B
    #2
    ( Q4 A$ w. k  P5 K# k#显示前10条数据记录
    / V5 [/ u+ ?/ [8 tdata2[1:10,]9 ^9 Z' p9 _: k$ _
    3 E: a9 a( o/ \. _$ J- a8 d
    #3' y, A/ s' [0 m) l' j6 u" ~
    #将变量名重新命名为英文变量名
    7 G2 {2 l! q) ^- `- w! t8 lcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")0 M; U  k8 @! M& v. T9 E" [
    colnames(data2) <- cnames0 W& v( b/ p( `8 W$ {/ F
    View(data2)% i( P% L; ~; P9 w1 ^
    3 O. O" v8 [) ~9 t% z
    #4
    3 [4 K! s6 [7 v- m# V#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录9 W5 X+ Z; [* f" y8 j8 r4 o( M. l
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))  l! _4 s1 Q1 C6 z
    #View(x2) #①先算出居住时间' G  ^: z- `+ |, \& \% ~. R; \
    data3 <- cbind(data2,x2)
    ( {* ?/ N7 H) m9 ~7 t#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    9 @6 [6 t( S$ e( K( Mlist <- which(x2<=0)# u5 l* w! Z7 X) M9 m! }
    data3 <- data3[-list,]
    " x; r* W* y5 V5 r2 yView(data3) #删除异常数据后是125条数据
    4 K" t5 [* m( G
    & c- _" o9 `8 I+ X#5. {" J6 G5 _. |) \
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    # w2 c6 B1 k+ i6 S' ?' xlibrary(lubridate)9 O7 I! d5 R% @9 z3 i0 L
    date<-Sys.Date() #返回系统当前的时间
    & V" E6 D  T6 K5 J/ j8 Knowyear<-year(date) #提取年份) P/ J; c7 ~# s$ k8 q! Z
    nowmonth<-month(date)  #提取月份2 Q2 e8 m/ R  U) B0 z. Y
    #View(date) #查看现在的日期
    % ^* d6 L- w: S. z) v6 Z3 B#View(month(date)) #查看现在日期中的月份
    - i: {+ t+ e2 c. H6 _5 Kx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))0 ]7 K2 C$ C9 U& \0 u2 E: M
    for(i in c(1:nrow(data3)) ){
    & |1 @: v8 R) |$ O% H  if(nowmonth-data3[i,"birthmonth"]<0){" _: v9 S0 P  y
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    % z% Q3 b4 z* e  }else{! y$ s0 I; K- {  N1 u
         x1[i,1] <- nowyear-data3[i,"birthyear"]- L  R0 S' o5 D' {0 T% d$ m8 N
      }
    7 X/ v! j/ `" W: U* Q}; I) s! F% |) O1 h: M8 A* D6 P
    #View(x1) #算出年龄x1,并加入到数据表中
    8 u4 e5 i5 m+ Idata4 <- cbind(data3,x1)
    $ b5 D0 w7 [: l; p0 J% MView(data4) #加入x1年龄变量的新表展示
    , _; j9 F( b$ _% \x2 <- data4$x2
    + Y! }8 x. U8 TMean.x2 <- round(mean(x2),2)$ |# |" F6 f8 [: J: s
    Min.x2 <- round(min(x2),2)2 B- m: O+ s! e" f9 F& Y1 I
    Max.x2 <- round(max(x2),2)! y, Q2 A1 i+ e  w
    Median.x2 <- round(median(x2),2)
    ; Y) G3 U( h6 p& ~+ x$ q3 |Sd.x2 <- round(sd(x2),2)
    , N. T# [  o' ^. z1 x- o& Ncbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果" a' t! j2 l7 `9 N% Y2 o1 Q
    Mean.x1 <- round(mean(x1),2)
    * W3 y" y) E' t  @Min.x1 <- round(min(x1),2)$ L3 J/ U) A0 u1 h. r
    Max.x1 <- round(max(x1),2)
    0 n2 ^5 \) _3 s# UMedian.x1 <- round(median(x1),2)
    6 H+ F- c9 ]& t  d2 J/ ]! pSd.x1 <- round(sd(x1),2)
    2 b6 N1 t9 h" t; A  Hcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果6 h" P, Q' y5 S7 Y
    x3 <- data4$friends; ^$ s* |* p* `8 H. C8 n5 e
    Mean.x3 <- round(mean(x3),2)) ?, C! `. w% M0 A7 }+ T
    Min.x3 <- round(min(x3),2)9 i* H! G, J" n8 N
    Max.x3 <- round(max(x3),2)
    & [9 Q4 l: q) j. {6 d5 L' o; zMedian.x3 <- round(median(x3),2)0 ^& l3 F& F. T* U9 j* b
    Sd.x3 <- round(sd(x3),2)4 ?  j+ W1 H0 Y  A9 b+ z
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果7 b. \1 ]: o) i5 K% p
    y <- data4$salary
      f% y% I7 b/ C- _5 w# E; iMean.y <- round(mean(y),2)% F# [3 c. W1 E$ R1 }7 X
    Min.y <- round(min(y),2)( {5 {3 u+ m3 d9 G
    Max.y <- round(max(y),2)
    / }/ ^7 g  @; S8 LMedian.y <- round(median(y),2)
    6 L8 i2 l; F* J% l# [& ZSd.y <- round(sd(y),2)
    - B& H# R* L* q+ s+ w! R# j$ Zcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
      q1 G1 D5 A0 L/ A1 l% j0 H
    0 i- ]& l& c$ t- [#6& l. {$ j) P) t6 t
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。8 k5 C7 w7 b4 L% f- D0 K
    round(cor(y,x1),2) #y和x1年龄1 ]6 \. g; [/ `. [7 E  |0 J
    round(cor(y,x2),2) #y和x2居住时间
    # a/ Y- o; W9 [3 U6 ~9 g5 hround(cor(y,x3),2) #y和x3朋友数量
    0 e4 m$ N, M( F4 ^
    0 d7 X: w% y5 [2 S7 t#7
    ( m% q; H0 ^$ f7 Z. {+ R1 T#分别绘制数据集中因变量与各个自变量的散点图
    * p6 f) J# x! L* g! v+ k- h. Apar(mfrow=c(1,3)) #布局,一行画3个图7 Z- n% G! m# q+ S8 d0 j
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    & [: i& ]0 D, ^2 [plot(x2,y,xlab="居住时间x2",ylab="工资y")
    4 ]+ @( P1 J" Vplot(x3,y,xlab="朋友数量x3",ylab="工资y")
    $ ]2 ^- n! [: g$ w% l$ S( U7 n5 d& s: F6 T' q8 W
    #87 w( n: o0 H7 x  N
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。, n& I( W) J$ h9 {  E3 s$ G! R
    lm.xy <- lm(y~x1+x2+x3)' l7 g& ~% Q, T" r# x" U3 |
    lm.xy- x' ]5 X" X2 a5 q6 L, A
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    % P9 }, b9 q# b1 \) p. G* [: a, R
    #9
    6 ]0 r/ }) s0 |+ _, V#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    ; _+ l- N$ e' apar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列. r; R. |7 H  q
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布' m; x) I: t0 {
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    " y. i' Y2 u8 r#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    + y7 N4 Z! a3 j; O7 w5 ^5 B#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    * o6 V( P8 w, r* U- dplot(lm)
    2 x# _5 k, q5 D- x" ~$ l9 tlibrary(carData)
    3 l5 z7 E, n* a* F" w3 |4 Nlibrary(car)
    8 X4 U+ N& b- `( Y( goutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    0 D! w$ y, y* J7 C; [5 V& s+ }% y  N/ D0 [- I: }
    #10
    7 Q* ~  N' T' s* f( F3 C#删除异常值记录后重新利用多元线性回归模型拟合数据。' N- s# z6 T9 @. N
    data4 <- data4[-136,] #删除该点- I8 o! e) H: k7 _4 S
    x1 <- data4$x1
    ) F# h1 B" r' l  x0 Qx2 <- data4$x2/ O  u5 @1 A9 C
    x3 <- data4$friends  }1 d0 ]' A. O1 P4 i
    y <- data4$salary
    / C8 I. w9 Q# Ilm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型9 N# d8 z, n2 ~6 D2 U: B
    lm.xy2+ ?$ w/ J' e& x+ r( A. K
    1 l- e! ~3 n0 I* j2 i
    #11
    - m8 W5 J! \1 E4 o( S/ r3 G#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    % G' U6 ?6 }$ C1 D6 e. j+ s+ S! g0 O; Ovif(lm.xy2) #p判断多重共线性0<VIF<10(不存在): f1 p# V- j2 B* d

    5 a6 u1 i: G6 q& z4 ?4 e#12
    + e- K1 o% n9 T* c2 [#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。# s. u( [" g7 l+ v! f- j2 m
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星/ F; ~4 q$ O8 o3 a3 z' O
    2 f& Y) J5 P8 C6 H! E3 b9 ]
    **********************************************************************
    # k% x3 O6 a' E& }6 h# v; K6 z
    2 M5 ]9 c3 `, w& F( O二、利用多元线性回归模型预测收入
    + d/ d1 a: d' M. s. A5 O! Q3 LView(data4) #124条数据
    - m0 P- c% o+ ?3 T. C* N( K+ S4 C#10 j0 O5 F9 q' I# e5 g9 g
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。: N- J" X% s0 J: r2 M: E% H
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    ; e- Y! w9 M2 w' N; C  StrainData <- data4[train0,] #训练数据
    ; ?6 }9 ^9 \" c: g8 w& l- f; AtestData <- data4[-train0,] #测试数据9 J! A  V( D. j2 t! ~8 o

    1 o* Y* c" E* i* s, G* D#2
    # \1 W4 b* `* c$ x( u+ ~#针对训练集,利用多元线性回归模型拟合数据。( N; k5 o" t5 M
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])+ P; v5 T% K/ x" b( [& ^) d9 T- h

    ( J2 l" l5 b8 c% C/ {; q7 H#3
    3 H' b4 K) L" M#对(2)中的多元线性回归模型进行诊断,处理异常值。# J* _; A8 F" t
    summary(lm.xy3)
    8 h7 \; b; O9 |par(mfrow=c(2,2))$ q: }5 T, U5 v0 W$ A  P, {
    plot(lm.xy3)
    . u2 C: m4 J. }4 ~2 r1 ^outlierTest(lm.xy3)
    3 c6 u# K0 x) Y+ o% _trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    4 w7 _+ V; i; a6 U# U2 T
    6 E* I* t3 X2 F. J2 I. J9 M#4$ R7 ?8 g1 L1 f* J- r1 ~5 {. Z
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。$ v5 E1 G; B7 n* [4 w, Y
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在); w4 Q( F- y7 \5 |7 R
    salary<-trainData[,"salary"] #引入的数据是训练集的数据/ J6 F! l1 ]" h/ H+ |4 F! m) b* h
    x2<-trainData[,"x2"]9 V5 @$ d* T( s' p
    x1<-trainData[,"x1"]6 C% c. |' B$ r  F8 z# G  A$ N3 k
    friends<-trainData[,"friends"]
    3 A0 [. h4 X) e) V' klm.xy3 <-lm(salary~x2+x1+friends)
    + P9 c! b: a, U+ |
    / m$ \# A. ^/ u9 n5 S#5
    4 `! n9 P  a% h9 O0 p- a9 V. A9 W#针对(4)中的模型,分别利用AIC和BIC选择最优模型。% n7 B/ K" b# o
    #AIC检验,赤池信息准则,选择最小的! Y7 [! t% A! I- O8 B
    AIClm<-step(lm.xy3,direction="both")
    . v5 K/ [7 c% q: e1 t( y. t#BIC检验,贝叶斯信息准则,选择最小的
    : a/ U4 s. f, C% P. u* cBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ! u) V3 V  d! [) ~
    # W1 T0 p( z3 N* v4 z+ G  h- G! h#6# r$ W' E1 V  C, B  A
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    3 Y0 x9 L; D1 g* N( I  E+ v  X#这三个模型预测的准确性大小,并进行解释。
    * K& k3 H) c1 o7 C: r3 cAllmodel<-predict(lm.xy3,testData)
    ; J4 q2 R+ c% U  |; a0 eAICmodel<-predict(AIClm,testData)5 |- d7 @+ D, l* _; e
    BICmodel<-predict(BIClm,testData). n( d# s! x8 i) \; k7 P
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差0 m+ Z! Q2 B/ Y* n3 ^, K! k
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    . T" y. u1 Y& j( t" e; U/ z5 B#标准误差能够很好地反映出测量的精密度7 ^9 c7 w8 b8 T0 S; i  ~- r" g
    MSE <- function(x){
    6 A- ?/ s" X2 x  mse <- sum((testData[,"salary"]-x)^2)/50! [! ~1 r) H9 ?8 B. a
      return(mse)
    8 w8 a3 c1 `* o8 Z9 A}
    ; f% B3 q- w! P. ~8 gMSE(AICmodel) #AIC/BIC/ALL是误差最小的+ S. r4 _2 l- S
    MSE(BICmodel)8 s3 V# R2 g0 f1 q
    MSE(Allmodel)/ k: B% I( s3 b: D" t
    , A3 E$ s/ Z! r6 U# g2 E
    # u( T' Z$ m- h2 r: `7 j
    ! P) i5 U1 J5 z- q& p, H! ^4 m* Z
    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-7-22 00:11 , Processed in 0.820734 second(s), 55 queries .

    回顶部