QQ登录

只需要一步,快速开始

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

    一、背景  ^* W% R( W( C7 A( m  u6 G
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    ' L. Y1 p7 T9 H/ g- B2 O& M#1) S7 ~0 C* D3 ?2 J
    #展示数据集的结构
    ' B& m; g# Z8 Hdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    ' |' ]) r6 M" F. K3 H, ]7 v! ^str(data2) #显示的结果有一列是多余的,需要删除) @( O4 s3 A6 s" K
    data2 <- data2[,1:9]
      y3 z) {1 z" C; Z1 N# Mstr(data2) #删完之后的显示效果是正常的没有多余列
    8 M& E/ |* d% j- X4 n9 A9 c6 _1 D$ P; k2 K0 g) X8 K
    #2  c( r6 \' D. Y) W
    #显示前10条数据记录$ w# F3 ?4 `" v' C+ X) y1 T, X( w
    data2[1:10,]
    9 f  O3 T  [/ h' J9 k, b1 x/ X  Y" V
    #3
    # ~; l0 ]! _7 q. @* l3 g8 q. k#将变量名重新命名为英文变量名) v! o9 |5 ^. l+ S
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")# ]' D. K& \8 B3 E; |' X4 r
    colnames(data2) <- cnames
    + t; J/ }5 O7 [8 ^) ]View(data2)2 q- \, G- ]* S8 ~" R% J  X
    & {  k. X) b  t" q* T# e
    #4
    9 _" k- [* W% ~8 G1 L) G#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录" U! j/ L) r8 x( R
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    . T% v# _' r2 @#View(x2) #①先算出居住时间. y9 u) n$ Z. z  x" c+ Q5 B2 ^) }$ m
    data3 <- cbind(data2,x2)" A7 T, r8 @: z9 G" e3 i' [
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    - F* D! z! I( p# x, z' Blist <- which(x2<=0)' l4 Y; s; z" D
    data3 <- data3[-list,]( S/ K0 f) I9 A# s
    View(data3) #删除异常数据后是125条数据: m% F* r, f4 g

    - K* Z: P" a' j( r9 }#5
    7 g4 h. C6 S) z# S" ]# a$ K#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    ) @- ~: c& G" G' ~2 r- y5 blibrary(lubridate)& R: q5 z* m5 t, w8 U( i- Q
    date<-Sys.Date() #返回系统当前的时间% h9 X  E% D1 B! f* e
    nowyear<-year(date) #提取年份
    ; e/ s6 M# Q" T' t8 M' @6 _8 t8 tnowmonth<-month(date)  #提取月份
    - A4 Q& G) ?/ Z* Q( k3 a#View(date) #查看现在的日期2 m5 X5 O2 n& r. ?0 Q4 Y; R; O
    #View(month(date)) #查看现在日期中的月份' X1 ?6 }5 @2 Z& t, ]% l# f! p
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))" `$ S# t5 b1 u/ I
    for(i in c(1:nrow(data3)) ){3 m& |& a- f, N+ U0 @( S2 Y
      if(nowmonth-data3[i,"birthmonth"]<0){
    # q( Y4 |: o: ~: o) C& L' f: S8 ^     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    " P- E( ?$ I- g- N  }else{7 H) N9 |1 q7 m
         x1[i,1] <- nowyear-data3[i,"birthyear"]  D9 r  x0 n! p, A( t1 Z+ H+ v1 d9 e
      }$ _8 H6 V; H1 E! ?1 d+ `
    }! ]) C7 e8 l/ T6 e5 b
    #View(x1) #算出年龄x1,并加入到数据表中. H8 w- [  ?% M; H
    data4 <- cbind(data3,x1) . v4 o0 i* Y+ \% ?
    View(data4) #加入x1年龄变量的新表展示
    ' k7 Q# y- |& h; s  Zx2 <- data4$x29 s7 s( `. A9 ?8 d% m
    Mean.x2 <- round(mean(x2),2)
    9 K0 L! O) }9 V9 T' w# D0 JMin.x2 <- round(min(x2),2)
    ( U  ~3 `* H$ e/ b( HMax.x2 <- round(max(x2),2)
    6 D6 K+ e/ |/ A( w5 Z7 A* M5 ~Median.x2 <- round(median(x2),2)* |1 ?3 ?7 j/ |) n% r1 u
    Sd.x2 <- round(sd(x2),2), W# ]" g4 L, y! R: Q9 ]
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果* C/ [6 ^& p, R1 D, S3 }
    Mean.x1 <- round(mean(x1),2)9 q6 `1 e. m" K$ P
    Min.x1 <- round(min(x1),2)
    6 v7 w6 c9 q, ~1 }: WMax.x1 <- round(max(x1),2)& T. R7 G; q/ \5 D
    Median.x1 <- round(median(x1),2)
    8 J% }+ |1 _+ P8 G2 h7 I/ ~' DSd.x1 <- round(sd(x1),2)
    & ]! D6 q$ {% f! Wcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果7 d6 p3 q% `6 G/ I
    x3 <- data4$friends* g- b4 k9 p' t! h
    Mean.x3 <- round(mean(x3),2)' e5 @0 z( |4 t( U2 n# W
    Min.x3 <- round(min(x3),2)
    % |  {5 f& V1 j; c: NMax.x3 <- round(max(x3),2)4 e0 O% q$ D: w! f6 P
    Median.x3 <- round(median(x3),2)
    5 I1 q7 c6 P( wSd.x3 <- round(sd(x3),2)
    7 f% y( s" m- h, y; y: Acbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    1 w9 H5 w' h7 _y <- data4$salary
    , N! }6 v& `4 [$ K( U4 @# m  d. ?Mean.y <- round(mean(y),2)
    - Y9 L7 Z9 H' @$ Q* HMin.y <- round(min(y),2)
    % V) M8 D' t1 `. wMax.y <- round(max(y),2)( t+ \- q) [$ V) s- x6 a5 Z
    Median.y <- round(median(y),2)* Q+ o# ?' ]+ T
    Sd.y <- round(sd(y),2)0 }* A7 q4 [" G3 C
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果5 y' |/ O0 j5 ?- e& z# Z! d# w
    8 H& z5 i; S  [6 \" Y6 U$ Q9 H6 c) x
    #63 c) A  \; U  F$ T& B# r
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    2 I3 S( y" Z, A% x" W) Around(cor(y,x1),2) #y和x1年龄5 \! s/ g5 [; N/ A
    round(cor(y,x2),2) #y和x2居住时间0 g0 O; d. T2 c- M& f
    round(cor(y,x3),2) #y和x3朋友数量
    8 ]2 l9 X$ s. E3 D3 a/ b) U% T5 s) e$ c! e. S8 u* N  S* `4 v
    #7" j& P3 u/ Y  V6 e1 K, K* i
    #分别绘制数据集中因变量与各个自变量的散点图
    " `+ U. M' [2 p2 Opar(mfrow=c(1,3)) #布局,一行画3个图
    0 A; o* i5 Y) m, hplot(x1,y,xlab="年龄x1",ylab="工资y")
    $ t3 R, u3 m0 ~; B/ \- }$ Eplot(x2,y,xlab="居住时间x2",ylab="工资y")+ X5 M7 @9 [. V" D( g/ u& W) Q
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    ; W0 v/ X. v4 Y) m3 g. y& M- ?# `! Q5 d! @( ~
    #8
    0 b1 A0 a3 x$ {/ M3 K) ^- _#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。3 g' y. L- |! k9 t/ z2 E
    lm.xy <- lm(y~x1+x2+x3)
    # U: ?% |) [  S; ~3 S. n8 ~& olm.xy
    2 p/ d6 i: j4 g( u% Q' }summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    7 t# d6 C  r( Q- h! l: v2 o+ s% a" `, C' J& ]8 \
    #9; V9 \3 Q9 J/ R6 k* ?
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    & O* r, Y. a& T( X. E+ Vpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    - X2 d7 \4 @& f& r2 t#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布" p" B- N9 P, O
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。+ X$ ?2 Q4 j1 B" e. t
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。5 A4 b& D) }7 ]+ J9 n$ `+ p4 S
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。. D5 i- j1 `' `1 M2 d) @; J
    plot(lm)' x9 T5 b4 i* Q" m  g
    library(carData)
    " j7 l2 A7 o8 q$ S; `library(car)  |$ W5 C) F* D7 z) i
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点9 q; B. s; a9 S2 y
    ) \6 Y' d+ Z7 a. F8 ?, {# i
    #10
    4 n7 n% ^$ k. B#删除异常值记录后重新利用多元线性回归模型拟合数据。
      h; D1 _, W) V8 wdata4 <- data4[-136,] #删除该点
    # n0 e6 j$ }) C( x2 P6 ^x1 <- data4$x1
    7 K9 c# y/ l6 t# ^7 B& O4 p9 W$ Xx2 <- data4$x2
    * m# u$ K4 y/ k% {, \x3 <- data4$friends
    # @5 a6 f2 G7 o7 t2 _% Q# wy <- data4$salary- C' z& \# E6 t. P7 |+ d# d+ I
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    ' k* F8 k1 i( l' zlm.xy2
    5 f6 q! \3 G6 W, g
    ! F0 M" s: A8 N3 }/ ?4 X' r; m#11
    2 k- [, U- x. i1 X8 L#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。: v! g3 `% G- {8 k9 u2 s# u1 O
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    0 j  G, G$ d( |" w. L4 {4 S& e1 b: @- d
    #125 a, s- z7 a, T+ G: p$ X3 N' z
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    7 x4 u9 E5 g" rsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星0 X+ U3 x  G( v* G$ S2 w+ @

    & e* ~1 s! X1 d# w0 A" w**********************************************************************
    $ _9 ~4 }' \& o& b8 {8 B
      S8 M% b- x5 v! c$ ?二、利用多元线性回归模型预测收入( W$ n8 |+ m0 T/ `+ G
    View(data4) #124条数据
    - r& j' q3 S2 f% ^# m#15 a2 u) u3 n* L3 ~; H( q
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。: w$ F4 T/ p  ?* q  [1 k, ]7 \
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    : I  L3 J3 y! g: `1 x7 M3 _+ u0 otrainData <- data4[train0,] #训练数据
    : G- n6 g7 a7 k& T( \testData <- data4[-train0,] #测试数据* M$ M) }! X: {% Z( L8 m
    1 G( k- l7 s: p2 m; H
    #2
    + o. k$ _! Q& Y" ^2 B( A. ?+ E  j#针对训练集,利用多元线性回归模型拟合数据。/ [% u3 n; H0 K# A
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])1 V1 l3 v* h; h3 K( S

    + q# R) z4 k8 Q( _; E# t( F: @#3" s# y2 q: m+ j6 ~
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    5 l+ z! i. l/ P- e6 @. v. _summary(lm.xy3)3 E7 ^1 y1 ^+ R/ L
    par(mfrow=c(2,2))
    # e% N: T7 h2 v1 n8 }! t- qplot(lm.xy3)
    & \" B4 V/ d& R2 Y  BoutlierTest(lm.xy3)7 S# t. |5 z; G
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    0 A( F5 J6 W1 l- C# ]1 I9 V8 q* [6 l  h4 Y4 \' X
    #4
    4 W3 p5 X; `) k  W5 n: x2 M8 @8 p#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    6 @) o" y6 }6 ^2 Uvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    ; W  N: o8 M# V& K9 B; ^salary<-trainData[,"salary"] #引入的数据是训练集的数据
    ) M7 O8 }6 L7 |  Mx2<-trainData[,"x2"]  V# a% a# ~  e/ C% q# p
    x1<-trainData[,"x1"]6 R  b' d' ?2 K9 B# |! ~1 N. \
    friends<-trainData[,"friends"]
    ; e( P: f( U. {3 Nlm.xy3 <-lm(salary~x2+x1+friends)& r  [- w6 @; t
    " N) w3 r! U. z1 ~' j
    #5. P( t1 r) E7 v4 i7 @
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    0 G1 b8 U1 j; z$ W* O#AIC检验,赤池信息准则,选择最小的
    8 O: O! c9 [  L; XAIClm<-step(lm.xy3,direction="both")
    6 M% d9 b2 S7 w/ G. ~  V. o#BIC检验,贝叶斯信息准则,选择最小的
    ) Z& n2 \5 w) c# ]- P# BBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ! X0 |! ~$ \3 b9 ?  o2 Y! k. {5 N8 B) I# g) I' k( [  M
    #6% p4 I- M# z0 e) |  Y+ D3 `2 f4 a
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    & M6 a3 {* K) {- ^1 K" ?: v#这三个模型预测的准确性大小,并进行解释。
    0 l& F0 u. g1 f$ X  cAllmodel<-predict(lm.xy3,testData)
    ) v6 B" R* u: l+ x) Y  cAICmodel<-predict(AIClm,testData)
    ; a8 g# K& e2 ?- s1 \- L- n; }BICmodel<-predict(BIClm,testData)
    9 F4 M% _# U: f, Z#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    ' U$ g# m/ n1 r) k6 W- f& P#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    $ ~' V9 M4 }. I6 B/ y& L#标准误差能够很好地反映出测量的精密度7 E. j) ~8 A1 g
    MSE <- function(x){
    9 q& P' q& }7 w0 f6 A1 I  mse <- sum((testData[,"salary"]-x)^2)/505 a& z* E' i% ~$ F$ n5 H
      return(mse): T7 f  y: Y# |% K+ o$ V
    }
    7 L. D, Y: s- p) S: MMSE(AICmodel) #AIC/BIC/ALL是误差最小的+ O6 E% K9 r! F# u5 H* r
    MSE(BICmodel)' @6 j3 ]3 [% t9 i: F. c! S
    MSE(Allmodel), u+ O7 u! {2 U3 |
    6 E4 w  C5 p8 J4 c  J9 }
    / c( V9 x/ Z: P

    $ P- G# |1 t; o- ^+ j7 k
    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-22 10:26 , Processed in 0.413184 second(s), 56 queries .

    回顶部