QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素5 N/ k# t- m8 P  q  a
    #1
    / V( g# J( o* y+ B4 Q& m# `# }#展示数据集的结构
    8 P9 x; t! _) P3 K! U  x' Bdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")2 ]8 Z/ ~' k6 i: }( ]
    str(data2) #显示的结果有一列是多余的,需要删除
    4 ~: _  }8 u) |data2 <- data2[,1:9]
    0 q9 w( j' ~, H1 a5 M. Istr(data2) #删完之后的显示效果是正常的没有多余列, n+ ]' d' s; n+ y4 m. _

    2 z5 g( w( _" w% b#2* f" ^+ ?1 ~% x& T
    #显示前10条数据记录4 a, V. z% O$ y) \) w
    data2[1:10,]- T1 Z" H" [5 D3 P

    & K0 @0 H) p0 O7 n& T#3
    0 O5 c$ H( m+ p% _! G#将变量名重新命名为英文变量名" {* i' v7 z/ Z) b$ Z
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    ) P* w2 t3 ~( u' D/ p6 |- ]' d5 @colnames(data2) <- cnames1 h) I3 t5 N4 [- _
    View(data2)
    + A, [; N0 Y2 Y1 @4 Q. d8 y/ v
    ; O- |8 D/ \; @$ t) f#4* v/ w$ |  y! G1 G; V% N
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录0 o; _7 a/ C3 f: X( U7 ^. c
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))1 U4 C" `' G+ U, g* O
    #View(x2) #①先算出居住时间/ ~/ t! k3 I) {+ y6 o
    data3 <- cbind(data2,x2): Z6 \$ i7 _0 _5 q! T3 ]
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    ) n; c* ]+ I; l; Q+ ~* C1 qlist <- which(x2<=0)8 ]* d; s* c% L4 }7 I5 \2 c, I
    data3 <- data3[-list,]- X2 p0 i) _5 r: P  j6 S' T
    View(data3) #删除异常数据后是125条数据# d, S5 s' q" D1 c2 V, y) `

    8 E0 L3 |, D3 G( M, U/ p9 j; P- B#57 ~1 L4 j8 J- U3 b
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    2 {0 l' b* \; f# @, m6 M, ylibrary(lubridate)
    4 o& g, A8 R; ^1 Zdate<-Sys.Date() #返回系统当前的时间
      L& h7 n' {; x& N9 ?  J/ o2 X# Onowyear<-year(date) #提取年份# h# Q  K& x' l' T5 U
    nowmonth<-month(date)  #提取月份
    * {& B/ k: L6 E. u# I/ \#View(date) #查看现在的日期; n. h) L' N  ?; O
    #View(month(date)) #查看现在日期中的月份
    9 N6 j7 o- U  O$ q# qx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    ) k2 i5 j' N. j4 Q5 ^0 t& mfor(i in c(1:nrow(data3)) ){4 t# ~3 `5 u- Y2 b2 x
      if(nowmonth-data3[i,"birthmonth"]<0){8 O0 ^+ |* ]0 b
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1! J$ [8 U" w1 Q4 ]4 W  D+ A
      }else{* {; L& [; `2 G" s4 Z  O. }' m
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    " `! U! R- Z" `* h  }  O* p, b3 Z2 ~+ n, r* @
    }
    ; w( J/ V  G# |#View(x1) #算出年龄x1,并加入到数据表中
    ; W0 Z+ D, f* `+ W$ ]data4 <- cbind(data3,x1) 7 `" `# [+ b2 d8 K- }
    View(data4) #加入x1年龄变量的新表展示! k# f* H5 ~, i; U
    x2 <- data4$x2
    ( }4 W( ?( M$ C' bMean.x2 <- round(mean(x2),2)# b8 J! \+ o+ a+ [) F% v/ M
    Min.x2 <- round(min(x2),2)
    4 _# l9 y$ m  lMax.x2 <- round(max(x2),2)
    4 N1 U; s/ Z9 LMedian.x2 <- round(median(x2),2)
    1 T' J' a+ |2 WSd.x2 <- round(sd(x2),2)& ^  {, n! u+ Q9 y& C, j
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    2 _! T; z( B/ g" nMean.x1 <- round(mean(x1),2)
    + S. P5 _, _# g! Y1 W! C; O* }3 rMin.x1 <- round(min(x1),2)
    # I4 \9 f- o0 _4 nMax.x1 <- round(max(x1),2)
    " u. \- L% Z- D( z5 \- `1 FMedian.x1 <- round(median(x1),2)4 G6 d5 J; ~' k2 z: O9 I
    Sd.x1 <- round(sd(x1),2)
    $ A& G7 L- f3 zcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果2 y( Z2 [1 g" U" R$ C
    x3 <- data4$friends
    - ?5 S' \+ k# o- J8 u+ |Mean.x3 <- round(mean(x3),2)
    6 p" X$ A% B# K, L# a7 Q2 R/ hMin.x3 <- round(min(x3),2)
    2 ^/ m, G9 b$ a& R/ _# m: K8 xMax.x3 <- round(max(x3),2), F' ?2 }( X/ M. ]& x
    Median.x3 <- round(median(x3),2)
    0 u4 J) z. J: A2 V4 G! nSd.x3 <- round(sd(x3),2). C& i- R6 u! N  M
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    1 u; K. g1 n/ v/ F6 v4 e* uy <- data4$salary# {7 Z: w, D+ v- C  f. a, R5 x7 K
    Mean.y <- round(mean(y),2)
    - i7 N7 N4 F. X- U! V# V( }  NMin.y <- round(min(y),2)+ L% ?2 M- k9 m
    Max.y <- round(max(y),2)
    / Q4 S% D( ]* N. e  v) ]Median.y <- round(median(y),2)8 U8 W3 f8 C; B
    Sd.y <- round(sd(y),2)) P: g8 M' |, x. |8 V
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果$ A! n6 K' r. m: {8 q% O
    ' w$ C- K; f# K% ]* ]8 A! q
    #6
    8 l8 r3 H' @2 W5 F#计算数据集中因变量和自变量的相关系数,要求保留2位小数。/ W* g3 s+ z+ b; p( q' y
    round(cor(y,x1),2) #y和x1年龄) f& z5 s+ U8 ^' e6 e3 A
    round(cor(y,x2),2) #y和x2居住时间- ]3 z: E! }3 b3 y$ l; x
    round(cor(y,x3),2) #y和x3朋友数量" d0 Y/ c6 p9 ^6 T. T: a3 n9 g9 i

    ; @- J" B% k  r3 t. n" h) a#7
    * d: ^' b# [9 t. P, q9 m: A4 J#分别绘制数据集中因变量与各个自变量的散点图
    1 }; W; V  C- cpar(mfrow=c(1,3)) #布局,一行画3个图
    6 @$ F9 j3 Y" o& E: uplot(x1,y,xlab="年龄x1",ylab="工资y")) ?. j: `5 i+ m2 L! S
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    8 c7 Q! \5 m) {9 dplot(x3,y,xlab="朋友数量x3",ylab="工资y")
    % p3 z- y" g5 p7 k2 ?
    0 W/ ~- R& y- M$ ]/ |! R! k  z# d#8) ]$ A: O7 Y' q" y+ ^3 f
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    9 N5 A7 ^0 O, C1 o% X  l  B  Plm.xy <- lm(y~x1+x2+x3)7 t4 }* a# ^5 X
    lm.xy
    8 L) v0 {+ x9 osummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    ( r8 _: g; k$ I) y9 U7 t
    5 ~+ D* s/ C4 m* c2 t#9* a" s# {( s9 z# n1 U/ s. f
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。! q( G+ k& U9 `* ^$ J, |+ H7 Q: U
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    * Y8 r4 R1 s( F* v+ i#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布4 @" M& ~- A) f# R" s
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。: E; C; j' z. B. Q9 _2 h0 I- f
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    9 {8 P; L" J! x9 Y#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    $ ]# l' ?6 B/ f* E* qplot(lm)& g3 Z5 U& d" ~2 t
    library(carData)4 I% U3 B4 n* p3 s( U* p
    library(car); B0 q! K1 ]2 b& h! e3 F
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点; T2 H: u, z0 P8 u: d5 `

    0 c1 W' a5 S4 @9 g& ?) |7 G' D- q" P#10
    ! w+ g# m" C" m+ j! c* T#删除异常值记录后重新利用多元线性回归模型拟合数据。
    / ?9 p4 f' R8 W# z  H0 mdata4 <- data4[-136,] #删除该点, I$ ^; i5 C# i* g7 Y; X
    x1 <- data4$x1$ F8 H) a0 o0 U: w7 ]
    x2 <- data4$x2  A) n7 N+ U9 g3 c; i: p  |! \
    x3 <- data4$friends
    ' ^( V9 V4 _% h$ uy <- data4$salary
    ! s' u# {# \- r, ]3 t7 l& Llm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    ' Y6 @- l+ m/ x2 f& W( n) I% q% Plm.xy28 r9 L$ U: C4 p: C3 |

    ! V( {# f" L, Y$ m* j) l7 A#11; @3 v+ K7 Q+ d& O: H) b
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
      g" ]0 ~3 U0 U; |+ }9 Ivif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)# [& ~5 \. S/ j% t4 N  ]

    / _# q$ Y& v  z2 c3 E. H1 v5 y#12/ Q& g/ W4 K; k) U1 v7 d, k
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。& u3 v/ j$ o4 D3 j
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星' A) [5 h1 A: t- R) l

    : q6 D% C% z& o/ x**********************************************************************8 M! h/ ~' \/ |5 g
    ) x1 `" F+ s  e8 x
    二、利用多元线性回归模型预测收入2 c" [8 J5 u8 v+ W5 S
    View(data4) #124条数据
    & `* R! S5 }1 c7 {#1
    - Y9 D+ f( E# q: j/ B#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。3 F7 N- ]. j# p- u  t" Y' U
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集* h  N& Q3 B: ~$ U
    trainData <- data4[train0,] #训练数据1 A& p! B% M. u
    testData <- data4[-train0,] #测试数据
    ; V' l' W6 G* M4 w/ r' W
    4 v( M" m( Z( i, Y. K#2/ P; ~1 N$ C; _
    #针对训练集,利用多元线性回归模型拟合数据。$ s9 W7 C& H% g1 y
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    & b& ]1 f6 f) m7 w  x( x
    : f1 i" a/ c# X3 I7 Y#3  b/ D' [; A/ c4 z# n, ?% K
    #对(2)中的多元线性回归模型进行诊断,处理异常值。% Z  ]3 a9 C+ G( @% [
    summary(lm.xy3)) Z+ P+ e0 C& Y. [* |0 w
    par(mfrow=c(2,2))
    ( |2 @4 \2 }! ~$ F+ Bplot(lm.xy3)
    4 I1 A9 o7 J1 D9 MoutlierTest(lm.xy3)
    $ a/ Z3 p! \2 y  s( c) _trainData<-trainData[-c(150,32,82),] #删除异常值,随机的4 y! o" Z  i3 [/ P7 L9 i  p

    * }# S- ^1 x% j- O6 J8 G6 x) y#4
    & m9 y; A7 n- Z( p2 c  a: w#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    0 K7 u7 g) m7 M& E$ S- rvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    9 V. X  }, V1 Z( H2 y0 L2 Isalary<-trainData[,"salary"] #引入的数据是训练集的数据, \8 Y& Q) s1 `: m2 N$ W
    x2<-trainData[,"x2"]
    ( d- S1 r) {2 z; c6 ?# A% gx1<-trainData[,"x1"]
    1 o- k  ]7 w, P8 rfriends<-trainData[,"friends"]' z- D, W% b* }
    lm.xy3 <-lm(salary~x2+x1+friends)
    9 @2 `* `4 g* c0 q; E" P2 i$ j7 e* z7 k7 H0 k) ^" }+ X) U
    #5) Y; i( v6 O/ ?# j% e1 w8 T
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    8 S% T2 h% P' t% [% w( v  g#AIC检验,赤池信息准则,选择最小的/ e' L( _. h0 L- J0 t/ @, p
    AIClm<-step(lm.xy3,direction="both")4 O9 ^5 i8 W( N' n9 m9 ]
    #BIC检验,贝叶斯信息准则,选择最小的2 Z: V2 d/ j: y6 Q2 [1 w
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    0 C( s' }* Y" ^3 J* _5 T  ?0 Q1 M7 j3 M
    #6
    : c- W7 H: E. p# s5 U#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    # z* ~0 `4 \2 v1 q! N& A#这三个模型预测的准确性大小,并进行解释。5 u9 }% i: _8 _6 A" i# [, x' f* Q4 G
    Allmodel<-predict(lm.xy3,testData)
    % \% |6 k% q1 dAICmodel<-predict(AIClm,testData)
    5 q( u, ]/ \! F2 B! ]BICmodel<-predict(BIClm,testData)) q2 w8 I) q8 Q5 @, N
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    * A2 e+ f1 X0 s3 k& x5 E7 C% F' k#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    0 Y2 j! y, e5 q* n#标准误差能够很好地反映出测量的精密度
    8 I, d+ r: b: F4 i, {3 D6 [MSE <- function(x){- F5 P( L6 ^1 O* D
      mse <- sum((testData[,"salary"]-x)^2)/50
    9 W# ~" j/ x9 w% z% s; F  return(mse)# p% |6 J, x1 P3 ^8 J
    }7 }5 Y( ?; a9 ?# ?1 p
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的- v$ q9 O/ n# c, g$ I
    MSE(BICmodel)6 I7 G9 ?: J1 [7 v) Z0 A& V1 e7 j
    MSE(Allmodel)! ^! ]! k+ g# e+ x  A% x; R
    - D9 b& q1 N- x( j8 N/ S& h
    / F/ L2 S+ O+ ]; X1 f' R3 \
    3 m' _* q/ h2 E4 y2 }6 v4 f
    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-8-25 20:20 , Processed in 0.436155 second(s), 55 queries .

    回顶部