QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素- }# h) }8 A1 G, u7 [
    #1
      m' l' p" o) A. V" v- O- `+ U#展示数据集的结构% j/ ?+ t( ~' N+ i- e( ]; L: X
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    5 G7 X3 T6 b$ _+ |. ]6 Xstr(data2) #显示的结果有一列是多余的,需要删除
    6 n$ \' y6 K! n; L1 l6 H- T# Gdata2 <- data2[,1:9]
    0 z! {9 \/ ?* b7 U7 f; ostr(data2) #删完之后的显示效果是正常的没有多余列
    $ r1 Y, P' ?4 M& e8 b. O, }# Z; c5 s* d9 s4 S" |) ^
    #2
    4 ]) j/ l8 w2 l) j' F- T#显示前10条数据记录
    & Q' _! s$ Z% O9 Edata2[1:10,]2 g2 ~2 P5 L& ^) E( t" ]
    ' ^, h# P6 M7 A1 F* F
    #3
    + P# o! O$ O$ L" N4 Q! K4 W( C' a; s#将变量名重新命名为英文变量名
    8 \0 w4 i7 R% }* f; jcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends"), H- d5 Z: Q, T: u1 a: I7 L
    colnames(data2) <- cnames! c' ?7 ^0 f( _4 b
    View(data2)) j% G: B8 e- ?+ i
      X2 R8 e' y$ B  ?6 A6 m/ i
    #4+ {0 R3 V/ Z% z! M% y4 ]( W3 C
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录0 S9 `3 l) O$ Y& f8 g
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    6 u* r+ b% j( b; e; B# F/ O#View(x2) #①先算出居住时间
    4 X& o( W1 g  l# i7 K9 Q4 L3 Z  Mdata3 <- cbind(data2,x2)
    $ m+ ?1 c3 ^* N- E, ?& K' o#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    1 y8 F# V# ?6 T+ nlist <- which(x2<=0)* C9 o, p4 T9 z9 @6 v& ?
    data3 <- data3[-list,]
    5 n5 R/ E" u5 @9 A9 S# [/ oView(data3) #删除异常数据后是125条数据
    + Z5 w+ Q% N$ Q8 j5 D' G& c! d2 A; Y" X* M( m8 l3 Z+ k
    #57 I) ~! V- @/ j
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。* R% Z$ O2 R, g: U, B1 |
    library(lubridate)' L/ N5 A+ y  H2 Y% E7 n* g
    date<-Sys.Date() #返回系统当前的时间
    ) Q# l, y1 J$ v" Q, n+ M, K/ Qnowyear<-year(date) #提取年份
    / U6 l" w" N/ [- O4 L" p: b: U- vnowmonth<-month(date)  #提取月份( O5 O& ]' z3 o4 O8 n- Y
    #View(date) #查看现在的日期* T! S% `1 k7 u) X* X- ^5 H
    #View(month(date)) #查看现在日期中的月份% a6 T* \- b: P. T% u- f
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    * H1 ]( x8 a6 l" V0 ufor(i in c(1:nrow(data3)) ){0 Z4 [- l5 l  \# C. k
      if(nowmonth-data3[i,"birthmonth"]<0){
    , Q) S! t+ M- p. i+ G# {6 K* M     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    5 K; o8 i- N' Z6 L+ N" Z  }else{2 O9 ]+ P7 x6 I' X% K, D
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    " q! j7 F4 O9 `2 G8 N, s" C  }
    7 H4 x5 f+ \' F! T5 v6 U}, V0 o( ]+ c3 \- o  v. [1 t
    #View(x1) #算出年龄x1,并加入到数据表中' V8 O8 |- j5 L9 W: ?) U' x1 A0 e
    data4 <- cbind(data3,x1) 6 ~. ]4 X' u" G/ H
    View(data4) #加入x1年龄变量的新表展示
    ! h. [9 B) z) [/ K0 t$ G' t) Wx2 <- data4$x2" D. Y( z" ]# a/ o5 l) T
    Mean.x2 <- round(mean(x2),2)+ C) d" c) q  ]3 |3 `8 X
    Min.x2 <- round(min(x2),2)7 o1 e) Z8 q8 m7 X9 F0 S
    Max.x2 <- round(max(x2),2)$ D# O& f. \: ^0 V8 m# R
    Median.x2 <- round(median(x2),2)
    ( K) m- m) k9 M3 PSd.x2 <- round(sd(x2),2)5 Y+ G7 d" \$ K( P
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    * t4 N. O4 r/ l1 H: k. l$ ZMean.x1 <- round(mean(x1),2)$ k) K9 [. r5 ]" v7 X6 X% K% z2 \. B
    Min.x1 <- round(min(x1),2)
    * b$ |2 ?6 N* N' _  u- qMax.x1 <- round(max(x1),2)
    * X7 b# z1 w" P& qMedian.x1 <- round(median(x1),2)
    " s* q$ r0 G6 E" x3 OSd.x1 <- round(sd(x1),2), m! q' {. @9 U$ |& Y8 k
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果$ w5 b. K) p: t. n& y7 ]+ R) m4 z
    x3 <- data4$friends
    ) A" R2 H  a8 bMean.x3 <- round(mean(x3),2)
    7 w/ x  I/ H9 `3 j8 jMin.x3 <- round(min(x3),2)# k# R9 T4 h* v) U5 i8 l0 j
    Max.x3 <- round(max(x3),2)
    4 V8 p! t6 k8 I8 c$ N# B" OMedian.x3 <- round(median(x3),2)
    ; k& o) V! v$ [$ OSd.x3 <- round(sd(x3),2)
    8 q; N; p) g1 U9 a& P; Hcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果  M, H: m! x$ }, J$ T+ D8 J' @
    y <- data4$salary, T% C& _0 M3 _# z7 z5 O3 M
    Mean.y <- round(mean(y),2)) g4 ]; ]) G& M' @0 Y
    Min.y <- round(min(y),2)8 H7 [- U& @& {1 P% P
    Max.y <- round(max(y),2)/ g+ K5 t; u2 w# _( |
    Median.y <- round(median(y),2)
    : @  e9 o. ~- a" XSd.y <- round(sd(y),2)4 t! V6 o9 g' u6 b. x. q9 `4 k+ O3 L
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果. v3 I2 e" l+ M! a( H

    . Z9 q& S# Y- W) s5 F#6* a6 N  Z- M# u, u. B6 f9 u  j
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    ( e( @, l1 p4 Z7 h, p1 ^9 ~round(cor(y,x1),2) #y和x1年龄; C8 Y# x6 k! g. a+ a6 w# _: L% t
    round(cor(y,x2),2) #y和x2居住时间
    , ^$ ]2 b8 Y( r( T' u( b9 {& Dround(cor(y,x3),2) #y和x3朋友数量
    $ @; Z5 M8 Y, s; @8 B5 D; P3 C5 Y9 _) e9 i! @  N
    #7; @# H  c( w: U5 Z- \
    #分别绘制数据集中因变量与各个自变量的散点图( i- l/ M: d0 m' `% S( C! W0 M* z
    par(mfrow=c(1,3)) #布局,一行画3个图7 X* S7 }# O- C2 a) V0 {1 Z) _
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    * J) C4 Y2 w1 I0 uplot(x2,y,xlab="居住时间x2",ylab="工资y")
      f! Z  d* {* {. ~0 h8 Tplot(x3,y,xlab="朋友数量x3",ylab="工资y")
    6 E/ B/ n! ?- H: g1 J
    # Q. C* y% _! M  p#8
    & ^- N6 s, ?6 k& X) ~#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。: n* b' B9 u* h. U! V& M
    lm.xy <- lm(y~x1+x2+x3)
    + z8 \' F" c% vlm.xy5 L0 |1 Y3 ?9 j
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的7 ]2 R: f$ z' x4 b2 W
    * U  W+ C2 E. I/ b$ f9 l
    #9
    ! l6 _' w( d1 q8 i#对#8中的多元线性回归模型进行诊断,确定异常值记录。0 T- f3 f6 X: P5 G9 K1 h7 y0 k* _
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列5 h9 A# L7 e2 v/ t$ z7 T' f
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    % _2 C& P4 b! Q) q0 l#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。" v7 [0 {4 \) J) q. a5 j
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。4 }0 |9 j. X1 t+ _: X$ Y
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    2 |( S! B% u1 T% q/ `; Pplot(lm)
    $ w; a& k/ H! O3 O1 K. ]library(carData)* {; b. F, C' Z" S# M) d5 O3 U/ D1 S
    library(car)5 m! d. i0 G% S' [: Q; L$ Z
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点5 w" j/ x  W' G/ L, s% o- B2 {6 r
    - S+ }) l  B3 o7 b# T
    #10; W1 _! `) U% {- A( ?( |" h
    #删除异常值记录后重新利用多元线性回归模型拟合数据。( v1 Z; Z& d& d  X" z8 k# ?5 h% F' u( \
    data4 <- data4[-136,] #删除该点
    . v: G- y; N( R* x) b8 cx1 <- data4$x1
    $ u& `, K0 s6 C2 ex2 <- data4$x2
    % m  Q* w( V( b6 Y, ^/ nx3 <- data4$friends
    6 y- r. b, a8 Q0 py <- data4$salary
    ; u8 F9 F1 G) i4 K& M$ Mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型: a% B: a8 |$ v6 t
    lm.xy2
    , L0 o: ~7 S4 a% e5 Y* R# Y" ?
    9 [6 w0 G. \# ^#119 e: `+ g. p0 s3 V4 }/ v  }- L
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。1 i+ _; i" y; J6 q. ^/ \* U% Z
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)! G: r. n% d4 n3 g! M9 I

    # K! G6 s9 H  I; T% q. g#12' i; x: x# W1 U
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    ! p0 h, _7 j9 qsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星2 [4 a/ Y  S  R% R+ M) k$ ~

    $ W6 e  `( S+ |3 S**********************************************************************
    9 D9 K% |' G( ?3 C$ k4 `- X) d( _, ~: @" `: B- r) \
    二、利用多元线性回归模型预测收入
    2 B* T$ D* \6 T/ hView(data4) #124条数据' |2 S9 y" s6 }( h' G
    #1
    2 c% r1 s* c/ Y. k' M! s* ^$ `- H#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    % n- @9 b1 B. w; L; ~0 K4 y' u+ ntrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集% `- m4 q4 s1 K
    trainData <- data4[train0,] #训练数据1 n, W+ |! P' x' @; L" c) x
    testData <- data4[-train0,] #测试数据
    : |( P* w8 S! I7 x. }' j. S3 U8 n. [8 X+ z
    #2$ V7 s* a) ~4 R: v- V: J& K5 C9 g
    #针对训练集,利用多元线性回归模型拟合数据。
    , e( N% ^6 o- I' r8 S, r. dlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    4 x' \& r& Z& c0 b$ a3 w+ O0 l  x/ Z# ^  ?: {
    #36 e8 U) ]: U7 J9 b5 Q) o4 L! y4 J
    #对(2)中的多元线性回归模型进行诊断,处理异常值。* A: F4 @. A- e/ O$ k! b* r/ p( T
    summary(lm.xy3)0 v! g+ E# f+ t
    par(mfrow=c(2,2))9 q, `' f( \: O" `' L
    plot(lm.xy3)
    ) U7 ~1 {* a9 P! X* P3 aoutlierTest(lm.xy3)
    ; k9 Y5 d3 w" N: l8 N- mtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    8 Z* Y$ y0 @, v, E5 M2 M5 k( U# G
      J; {* M; k9 `/ f2 t#4
    / w6 S3 L' K8 Q  P9 d#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    6 f( H5 h  C7 B7 @* ivif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    1 ?& g/ o4 [1 A8 }! \6 H) T2 Dsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    4 m; K. o) A! Q0 {x2<-trainData[,"x2"]
    + u+ b8 V4 b* m( ix1<-trainData[,"x1"]) {/ o9 \, D% v/ r
    friends<-trainData[,"friends"]( f; L6 b4 R3 A: v  U4 C: `
    lm.xy3 <-lm(salary~x2+x1+friends)
    ( {7 z* w8 x# B  Z. X! O; H& ?1 H; D  i! o- X' ?
    #5) F4 g. K+ _" z# R! Q
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。! ^) x$ ~, e7 H2 `
    #AIC检验,赤池信息准则,选择最小的3 [0 d9 U7 B0 }% Z
    AIClm<-step(lm.xy3,direction="both")
    - Q8 u; z+ C  _; H* }1 Y#BIC检验,贝叶斯信息准则,选择最小的2 Z: Z8 }" F; t3 ?, @$ I! l
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")$ b/ c5 C8 l* I

    $ y1 }5 H8 n1 G#6- z; l2 X' [; h" Y. \' T
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型1 g2 `; X$ w! }! o! Q
    #这三个模型预测的准确性大小,并进行解释。+ s' W* P% s; ]* ]4 u6 r8 E- g$ Q
    Allmodel<-predict(lm.xy3,testData)
    * u+ y; E6 R9 \4 X) K" KAICmodel<-predict(AIClm,testData)
    4 p6 p; g8 m) ?3 s0 K# _6 V6 @BICmodel<-predict(BIClm,testData)/ q& \- E" P' m' [
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    $ C  `# U5 R- t: C; m5 }3 Y#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, j: x7 G0 N2 T! f1 F: I- [
    #标准误差能够很好地反映出测量的精密度: p/ g, w$ E  H! ]7 m
    MSE <- function(x){% q% \/ ~0 k) l8 E+ i- ?
      mse <- sum((testData[,"salary"]-x)^2)/50
    ' j* r7 Z' N0 l6 y0 t" W& C4 X  return(mse)
    3 ?1 |1 J& |* S}7 u4 V' k% Y  g# |9 M
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的! r+ [/ I$ s4 e/ e! e. j
    MSE(BICmodel)
    6 p2 b" x  q( nMSE(Allmodel)
    2 a9 C$ D8 N. ^, |" C9 w* ]6 v1 D9 V" v: b  ]7 H* _

    ; M8 [( d& k# I, X. Y$ H* ^( y9 T: ~: `! x2 a( y$ b
    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-6-4 08:41 , Processed in 0.451820 second(s), 56 queries .

    回顶部