QQ登录

只需要一步,快速开始

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

    一、背景
    3 t$ t* a4 V8 y, f' S1 z: c) v  J数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素) U; N5 r; e& ?/ N) Y5 E  v
    #1
      {" k$ ~7 }; t* }#展示数据集的结构
    / D8 E7 s- I: e" M: Z2 ^1 ydata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    6 _: G. M* n- O* P+ g6 ?str(data2) #显示的结果有一列是多余的,需要删除5 i$ g/ G& a( d$ F9 n" H1 t, A
    data2 <- data2[,1:9]
    ( l1 n2 r8 Z) s, j" bstr(data2) #删完之后的显示效果是正常的没有多余列+ d4 G! y4 x0 {- i% p# k% h
    8 g. x. s0 Y, \
    #2
    : S" d7 }$ U8 s' c' L+ c. y% t$ p) l#显示前10条数据记录$ I: w# J& a' t" M. B( V
    data2[1:10,]
    6 r/ u# d# P5 D& [: _* h7 S9 v# f& l  J3 W* e; |4 c
    #3$ w% t* a/ \! n6 K1 R
    #将变量名重新命名为英文变量名
    : l# _' F& h3 ~6 _* k, Pcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")& {  V' l7 f% y  f9 y# O
    colnames(data2) <- cnames1 Y# x8 z& f. q5 N- @
    View(data2)9 M3 W9 l- B2 C+ F# u6 P3 R1 [

    & s! r6 d7 c6 l; j2 T3 f  J#4: U( X& C# g9 c# ~; k0 D
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录2 J6 a. C. z" K8 l' S0 s2 }
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))+ j6 ^$ |, T- \  I
    #View(x2) #①先算出居住时间, l( }7 b7 B# i& J
    data3 <- cbind(data2,x2)
    4 G: h6 P" z* \#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    # ?0 [2 f& R+ Zlist <- which(x2<=0)
    ' Y/ q$ A1 m8 j4 {# b7 \data3 <- data3[-list,]
      s& q. w  M* Z1 I8 NView(data3) #删除异常数据后是125条数据
    ! z) s7 S* c6 r; O4 x# M* _
    / t) e/ O) ~6 a. G: J/ O& q0 v6 \#5
    $ G( J* Z+ e/ f! ?  [#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。# t- z& f8 k; ~" m1 z; K
    library(lubridate)
    3 d6 E2 g4 L" ^" S) r8 xdate<-Sys.Date() #返回系统当前的时间; Q8 P' B; Q4 n# O- h7 X+ G
    nowyear<-year(date) #提取年份6 D) \$ |" i) N6 }, Z# ^8 V+ U
    nowmonth<-month(date)  #提取月份
    $ O+ [$ e3 ]6 q) v# ?, _: r#View(date) #查看现在的日期
    : w* b! t: i4 L2 ?$ {#View(month(date)) #查看现在日期中的月份* s& u  g2 Q, J9 @! x2 z
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))" T9 ?% r# p+ w0 y2 [
    for(i in c(1:nrow(data3)) ){
    ; t; B5 A/ [4 K' N1 O  if(nowmonth-data3[i,"birthmonth"]<0){
    2 l) `! q& y, \8 l$ b     x1[i,1] <- nowyear-data3[i,"birthyear"]-12 S7 O; I8 k. P7 w0 }  t
      }else{
    9 h$ R/ F  G0 Q& I0 P! D     x1[i,1] <- nowyear-data3[i,"birthyear"]. b/ E+ w/ K" m4 p7 d
      }
    2 e$ [5 w# N# y8 W}8 x4 V) E+ B3 B/ y. Z/ ?
    #View(x1) #算出年龄x1,并加入到数据表中
    1 M/ `3 n2 \3 z, Jdata4 <- cbind(data3,x1)
    9 w2 {( `, {- a; l! F4 p. kView(data4) #加入x1年龄变量的新表展示
    9 e7 t5 g+ C$ A! \" r. F7 mx2 <- data4$x2- Y( O  Q9 n1 r% _2 K- U
    Mean.x2 <- round(mean(x2),2)
    % _1 J$ k( Y) j& J. WMin.x2 <- round(min(x2),2)$ }2 h4 h2 p; t; W+ c
    Max.x2 <- round(max(x2),2)
    $ N( k5 u, P* T. U0 t8 iMedian.x2 <- round(median(x2),2)
    9 t. u3 X2 K$ E. TSd.x2 <- round(sd(x2),2)
    , H) E  v1 n6 a# j$ ~cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    ! n  w- `, g3 Q8 TMean.x1 <- round(mean(x1),2); Y) h9 p" v7 H
    Min.x1 <- round(min(x1),2)3 E$ s+ }6 g, o) D" A; q. _4 U
    Max.x1 <- round(max(x1),2)
    * l& a2 x6 Y' H% e5 `Median.x1 <- round(median(x1),2)6 ]! y. E0 h; _2 l+ A& u
    Sd.x1 <- round(sd(x1),2)
    5 O3 `0 z9 i+ q) }8 {cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    2 T$ S& Y  c3 o5 T. Q& Fx3 <- data4$friends
    + y* e  E6 H7 s2 Q5 d, `. ^Mean.x3 <- round(mean(x3),2)* Y8 ^$ S9 X0 d2 n  W
    Min.x3 <- round(min(x3),2)6 ~! U+ C7 w  e, i
    Max.x3 <- round(max(x3),2)+ z3 C/ C1 r+ C) a& k9 b  _
    Median.x3 <- round(median(x3),2)
    * T+ D5 K2 e% ?% b- M0 f3 ]1 R: USd.x3 <- round(sd(x3),2)) U( v2 y) G6 T2 x# j8 r% ]4 D
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果: l8 \% c- j. S; W. s  p
    y <- data4$salary
    8 ]' I# y9 e( T6 |; LMean.y <- round(mean(y),2)0 S) l+ F  E  [, ^
    Min.y <- round(min(y),2)0 B1 t# e1 b6 j8 T, d
    Max.y <- round(max(y),2)  Q5 s1 N& y0 R9 Y+ `
    Median.y <- round(median(y),2)
    ( e: g& [4 I/ Q  oSd.y <- round(sd(y),2)
    6 o1 \( L3 j; ?; Q2 B8 dcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果0 B0 F: @* ~+ P2 r

    " v( B" Y- k- N& p- r0 w! f6 y5 ^4 Z#66 O  g* t# l/ _3 u: H
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    + l  Y1 u0 D! l+ g' j5 [$ around(cor(y,x1),2) #y和x1年龄9 H$ `( }5 }& g
    round(cor(y,x2),2) #y和x2居住时间
    " A; R: r6 j% X" Oround(cor(y,x3),2) #y和x3朋友数量) g+ ?8 v3 S/ h/ u$ c# `+ Z* V

    ; ~2 ~' ~1 d% j9 M' u/ Q#7+ B6 O. L1 C8 ^6 J9 \5 F
    #分别绘制数据集中因变量与各个自变量的散点图
      }9 R" H3 M  S4 T- upar(mfrow=c(1,3)) #布局,一行画3个图( f+ X( y. I0 g+ T$ M6 F! P1 c& i
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    , t- T' A: j, w% h1 w. p7 K' k* Yplot(x2,y,xlab="居住时间x2",ylab="工资y")
    ' i; i% J- G# \9 c: s2 R) hplot(x3,y,xlab="朋友数量x3",ylab="工资y")& U& L' ]& I+ y$ y

    1 e9 I& w  Q; l$ U2 ?#89 c! X* g/ c; w9 s: ]9 F' M
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。. ]1 T+ n0 |" b1 g
    lm.xy <- lm(y~x1+x2+x3)
    2 h. Q! L7 v9 ^8 c' H$ T! r5 klm.xy7 Y. E0 K% o0 {2 B5 g; g+ B0 A6 O
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    2 @/ q7 B$ O1 ~
    " o0 I( l0 R5 d#90 @3 \1 k5 {8 w* k5 d  A
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。. C1 L% f  q- ~1 b- ?1 P7 ^' L  E
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列0 ^3 j! ~1 W* e7 R3 k
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布' h4 d" @! _5 b' }
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。4 f) G, _2 ]. U' K/ L
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    ; R, }4 Z9 z" \1 ]6 f8 J- j#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。  u5 {8 r% N; }. r: k! o
    plot(lm)4 r" T9 H+ `# R
    library(carData)% a, T8 \" z( B! m
    library(car)
    # f* e' W, {% Y* U" l, Q9 t7 @9 loutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点$ t5 _! `/ `, B5 @' w" N& w  j
    ) l; F8 v6 ^) s( H
    #10* W! e3 p! y( j' |
    #删除异常值记录后重新利用多元线性回归模型拟合数据。8 ?. H4 {/ v% k0 _% U5 w3 Y5 b
    data4 <- data4[-136,] #删除该点& n$ o3 ?2 h0 I; q
    x1 <- data4$x1
    ) M8 _9 y: U3 I) L2 L9 ux2 <- data4$x2( s, D# Q: X+ ^. z4 `# C2 A' |
    x3 <- data4$friends" j) v0 S: E& U9 N* d
    y <- data4$salary
    5 y) d/ M$ q3 Clm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    - j2 E. Q) G7 o7 {9 Klm.xy2
    , v- p; \7 k) `  C& e# v* P3 E; I6 ~
    #119 n& g0 \( M1 `  }
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。6 @/ J0 h1 i! b  \
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    ! j8 N) V2 B  O9 V$ ^) c/ |& f+ ?
    #12
      J! W8 m* r. T; y  T+ v9 m6 M' a% ?#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    & ?; l& p9 @: Q7 Z3 @summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星+ R9 d( y$ R- S
    " B  Y# O9 M. N$ l. \2 V
    **********************************************************************2 i: u4 ^* U& n+ I

    # Q4 s( b. I! K' m* {( S二、利用多元线性回归模型预测收入! V- X. d& W/ t+ w) E
    View(data4) #124条数据
    8 ^9 e/ W" E& W3 O3 W0 J5 M4 v% p#10 x( D: L5 R% a0 l3 D
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。5 W- W0 J# N: O* @/ e8 d
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
      e/ q+ p" |4 u. R  A& W8 Z4 x7 RtrainData <- data4[train0,] #训练数据/ q/ W0 y+ @( [: R0 w% f2 W' }
    testData <- data4[-train0,] #测试数据, C$ @$ N7 b* L2 Y. U

    ' ?: c6 B, |3 g! o! s& x#2& Q: Q% a. ^; _2 ~) {$ {5 [) p
    #针对训练集,利用多元线性回归模型拟合数据。
      O$ h( _  r5 Ulm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    , d2 D1 X6 l9 o0 ~: c0 ^& j
    4 B& M  Z, F  Z; p! {#39 m1 E4 p) ?: u1 F5 X# X
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    , x8 r* n7 e1 f6 x4 ^summary(lm.xy3)
      c( C2 x1 a' k3 M. F, \par(mfrow=c(2,2))
    - g/ I5 L/ h% T' y" |. P- bplot(lm.xy3)
    6 u: l6 g1 A% H4 u4 U6 s( y1 i/ foutlierTest(lm.xy3)
    : f# h0 p1 f/ [trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    - X$ @) x! C" i5 \" c/ Q* s
    ) [4 ~# p; p7 b, e#43 t0 _' y% [0 H4 T/ R4 o0 k
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    / O: g6 z# _: _) j6 D8 ovif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)1 Y3 ^! W% p$ ]2 o+ g
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    2 G$ N" l" c0 G9 px2<-trainData[,"x2"]
    ! Y/ d/ K3 ?2 ]. _6 c; Yx1<-trainData[,"x1"]
    0 e5 V) j! o, P* B. r6 [friends<-trainData[,"friends"]
    0 h+ }  u9 `1 ~lm.xy3 <-lm(salary~x2+x1+friends)
    2 j  N" `6 O8 O, `  B  O! \) N2 B7 p; T
    #5
    ' h+ ~8 `0 G8 b8 F$ v6 A2 `#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    & T' _* w. }  L9 ^( k2 n% u4 c#AIC检验,赤池信息准则,选择最小的
    1 t- J5 \0 b: }4 ^+ C% L) O. E9 VAIClm<-step(lm.xy3,direction="both"). D4 J( k+ N4 q4 a
    #BIC检验,贝叶斯信息准则,选择最小的
    7 k2 u3 e, R6 x6 n: R( EBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    % }$ ~: c3 e' Y8 N9 a7 |  F1 K+ w: s
    ' t3 T/ P- v" O% G; T5 B5 I1 b#63 w" v: r+ d( R
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型" O, n0 p- q; ?0 p  t3 {3 g5 m1 N5 q1 e8 t
    #这三个模型预测的准确性大小,并进行解释。
    2 ^  u: l/ z9 i& f! u6 AAllmodel<-predict(lm.xy3,testData)
    7 n3 R5 B  m/ f4 mAICmodel<-predict(AIClm,testData)
    5 ~2 A. V' S5 O0 dBICmodel<-predict(BIClm,testData)
    : E  r1 P8 V9 j#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差* _. q. {3 _' C- G# K
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, v3 H; r- w2 o" q
    #标准误差能够很好地反映出测量的精密度
    " Q7 i& k) E; [* h% D8 |% fMSE <- function(x){4 W( `! J: R  s- d6 g1 \
      mse <- sum((testData[,"salary"]-x)^2)/50
    & H' H+ Y# z5 _6 I  return(mse)# Y8 L0 N. l) G- {
    }! L+ N+ Y, m6 |
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    & I% D- b% B. _: s# hMSE(BICmodel)# r: R6 {2 r6 s( J3 ^3 {
    MSE(Allmodel)
    $ m3 C7 u) c! }+ ]2 Q) ^5 b$ e* O
    ) l6 q; @5 ~6 V3 Y: y; ], K

    ' P# d# t) E" u% S
    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-28 00:31 , Processed in 0.448102 second(s), 55 queries .

    回顶部