QQ登录

只需要一步,快速开始

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

    一、背景
    % i4 i; m4 J( d- Z  Y数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    + x* `; P9 O- u/ _3 ~2 |$ ^#1
    % t/ ]3 Z2 R/ \* H1 Y6 W#展示数据集的结构; g1 T6 [: M. \0 |- t2 {- L
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")3 @4 Q, @: }4 U1 G  U
    str(data2) #显示的结果有一列是多余的,需要删除
    % Y' j0 ~* X0 |1 V0 g$ ndata2 <- data2[,1:9]4 G( M6 W0 l/ z7 \" W" F4 B
    str(data2) #删完之后的显示效果是正常的没有多余列# z; U3 u" D/ y/ K8 i; S0 x( H

    3 h6 E$ M5 n: e' U/ e$ K#2
    , k5 o7 {6 p% W+ b, P* C" `  j8 y#显示前10条数据记录5 ^" m7 Y! n9 Z+ Y2 M, @; W
    data2[1:10,]& {5 }/ Y" b: W3 T$ o& I4 X

    ) y( s7 }/ I3 j#3
    - a: |9 R. W  l' c: ~' v' u- a#将变量名重新命名为英文变量名) {7 w4 S  K% s* k' a) b
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends"), a; o$ ], J1 c$ o
    colnames(data2) <- cnames6 b2 B2 b5 ?( M2 R7 B
    View(data2)- B: X. G0 @0 e( _. V) s$ m- _

    * D' [) j$ c  e( S#43 w: A' S3 ^' C! f* l5 K
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录6 l; a2 A( M' F) J
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    & D$ L9 `9 ]# G6 F+ f6 h#View(x2) #①先算出居住时间$ N( p7 |% h2 d! E( F- D# T
    data3 <- cbind(data2,x2)/ A0 n6 A  A5 I7 O+ i
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条" B8 _; d" q7 y2 @1 |* v( K0 `
    list <- which(x2<=0)
    / T' {1 `; ]& `9 O5 S5 l# rdata3 <- data3[-list,]
    . Y8 v5 A$ u, h& W0 P* `- hView(data3) #删除异常数据后是125条数据. w) Q5 G0 E' V: \8 z+ b1 f
    & G. \/ H$ c7 N; n6 v5 o5 E5 h
    #5
    / {; S# f* D# I+ f3 e" W& [; b4 |#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    9 h, c" f. r4 D+ s5 t, glibrary(lubridate)$ P7 I- Z' f. }
    date<-Sys.Date() #返回系统当前的时间  }. ?$ V* D0 c2 W& I- d: N
    nowyear<-year(date) #提取年份
    # n7 f9 K7 f5 g- Pnowmonth<-month(date)  #提取月份
    " n, z1 ?# V+ }) N8 Z& [#View(date) #查看现在的日期
    ) ~# {7 T8 a4 E#View(month(date)) #查看现在日期中的月份
    : R  g6 t/ g/ c) i7 O6 {8 X: G% Ix1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    6 F$ j2 m3 |3 g( A  Tfor(i in c(1:nrow(data3)) ){
      s; U; X- X" O0 k8 k: [, _: B  if(nowmonth-data3[i,"birthmonth"]<0){! S5 w# E$ n9 s4 C8 V& J* y" v- n! T
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    - _* ~% \0 C7 k, z7 h, v  }else{9 S2 r" O; ]5 p7 k! l. q. C
         x1[i,1] <- nowyear-data3[i,"birthyear"]: c+ n' u1 A5 g$ B9 Z" V
      }$ ~$ P% ~- i, q) X0 Y2 f
    }
    1 l( B/ K9 N7 k! v#View(x1) #算出年龄x1,并加入到数据表中7 Q, C7 o. h( z+ G( t. m
    data4 <- cbind(data3,x1) 9 V. N5 z" G! r# H. v
    View(data4) #加入x1年龄变量的新表展示
      B) o8 Q+ B6 M' ]x2 <- data4$x23 T' _7 n: s8 K! L" T
    Mean.x2 <- round(mean(x2),2)0 M) b& \- H0 A/ k0 N7 n; `. {8 {
    Min.x2 <- round(min(x2),2). a3 o# L/ _; |, Y* x2 K# E; Z
    Max.x2 <- round(max(x2),2)8 b8 o+ [, j* |* @/ F6 M
    Median.x2 <- round(median(x2),2)
    ' D! r, X! W, H9 @. LSd.x2 <- round(sd(x2),2)
    3 {5 t) [8 d  `# f' Icbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果, G$ d! T1 R3 L
    Mean.x1 <- round(mean(x1),2)! W' x. I" a. @. T# U
    Min.x1 <- round(min(x1),2)
    6 Q9 D3 L9 a  ~Max.x1 <- round(max(x1),2)
    6 c* u* A3 h0 x& MMedian.x1 <- round(median(x1),2)
    0 c' o4 {1 l; v7 E6 s6 }2 S) ASd.x1 <- round(sd(x1),2)$ i8 [- e% ?. I6 m' i' x1 }' {- I
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    . h2 c( o2 n% h6 B7 C3 ]7 e. Jx3 <- data4$friends1 [  _8 u8 ]4 o) b
    Mean.x3 <- round(mean(x3),2)
      x4 s% l3 Y! ], jMin.x3 <- round(min(x3),2)
      B- u' |/ j1 O, z. ^: p* lMax.x3 <- round(max(x3),2)
    7 ~6 P4 U' y! X  _! G/ h$ n: KMedian.x3 <- round(median(x3),2)
    - R! J6 e/ a7 |+ n& q* lSd.x3 <- round(sd(x3),2); S; M+ M. u) }& m) f' S
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果$ |5 I# u" n& m! z
    y <- data4$salary
    - K2 z. l% }  P* g4 `0 s: _Mean.y <- round(mean(y),2)
    3 D; H) d, {7 ~6 L; r  HMin.y <- round(min(y),2)
    # G- T8 Y3 y4 @8 f& n; k. fMax.y <- round(max(y),2)
    % s- m1 a; T, ^Median.y <- round(median(y),2)
    + u- ?2 M1 O  l; L3 f: `8 t7 W6 R$ m3 iSd.y <- round(sd(y),2)# l+ d0 h  I1 s8 O
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    2 j3 p/ O; B+ u; ~( @6 r, P+ |7 V$ h1 W  h* t% d
    #66 n& S& A% I2 n0 Q8 n
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。# g$ }9 j2 l$ M* Q, b4 ~, r) @& l
    round(cor(y,x1),2) #y和x1年龄$ F( J# A0 ]8 h0 q- ]8 i
    round(cor(y,x2),2) #y和x2居住时间
    5 {" P& J/ z3 B" V" E3 nround(cor(y,x3),2) #y和x3朋友数量
      S$ P) ]3 u  G! n7 p! f' B% {( n
    #7
    0 d- M2 x2 q! u- M  h+ P" ^, F4 m#分别绘制数据集中因变量与各个自变量的散点图
    ' N# U( S# D( O2 g9 R  m/ }* Spar(mfrow=c(1,3)) #布局,一行画3个图8 c6 o" ?% B6 {* E# x5 }4 D0 i( c
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    ! r2 Z  H, W% u& _6 G9 `plot(x2,y,xlab="居住时间x2",ylab="工资y")6 p5 @( S7 d! T" N" k
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")5 f& }$ {; m; f/ K- E
    - n6 Z7 `! b7 }/ n
    #8
    8 X$ G: U0 K! e3 n! D#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    1 j/ y( V& l; c6 _lm.xy <- lm(y~x1+x2+x3). C: Q+ y; V, O6 t% b7 C
    lm.xy6 U. w" K$ ^: ?2 ^- n
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    / b8 ~7 a- ]% m9 s# }! X0 g7 f, q; [2 c( R2 V  B: n1 l
    #9
    . L  @8 m! y/ Y( q#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    : L  M& c9 u5 q! l! X- epar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    $ w% c. w& _4 I+ I/ n! W" G$ {#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    / T9 c( c7 {# g2 G1 G#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。1 ~: i5 U7 Q4 f2 \) V: T
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    : Q& _& G3 _$ G+ s, C( H' o. G#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。/ ~, F. z+ @4 N& U1 a) v
    plot(lm)& E3 K' z0 C- H
    library(carData)
    , m% Y- |5 B( j+ j9 U3 U2 flibrary(car)
    % Y) D. [  D' X( d7 ]5 I+ W$ xoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点, N1 {9 }" r" ?% m

    & c* R5 m0 V" M' ?- C) L: F" C. g6 n#10
    $ z. j3 Q( y7 U#删除异常值记录后重新利用多元线性回归模型拟合数据。4 P0 P! a. C/ J) _8 Y
    data4 <- data4[-136,] #删除该点. }7 }5 J7 B% D9 P8 b
    x1 <- data4$x1: `1 k" C7 W+ K$ Y
    x2 <- data4$x2
    ; g( ~7 Y5 x+ n$ ?+ ]+ Nx3 <- data4$friends
    / f0 S: p- t' q* s" @y <- data4$salary
    , r% R4 Q8 G$ B# v- }lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型1 \, w5 a* Q7 K9 ]0 Y1 n
    lm.xy2# m# t& F+ l1 ~5 D6 d* b
    , K1 _7 Y& _8 _2 @7 v# Q. i) c
    #11
    2 L7 `3 G1 }& E6 x6 Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    * ?% \. Y; x  M5 Avif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    6 a1 k  [0 K6 w6 G$ s" h# l6 g" e+ `- O: B( y$ \
    #12
    9 K$ i( C8 s: u5 |# N% S- q5 v! y#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    , ?9 k0 @$ ~+ q6 S* dsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    1 @' n7 i! N9 M" t) N$ U2 J" h* Z4 K& x8 n2 x7 j
    **********************************************************************
    7 ^; o! {9 ?; L) a- Q1 m: I( D
    * G: `3 \7 O# ]* y7 X二、利用多元线性回归模型预测收入5 e# C4 N' k# V6 K
    View(data4) #124条数据
    % n* ~) f  X8 o7 G#1
    5 m  R4 v7 {  X+ p#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    + ~# ~1 I/ X. c, `" ntrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    7 d; z% F2 D+ WtrainData <- data4[train0,] #训练数据
    1 k, j# V* L6 j9 X6 D  ctestData <- data4[-train0,] #测试数据
    . `$ c. q' v" V2 R% g  w# X6 B( Q& t% f- r! {
    #2
    , f3 ~$ ~" Q9 F# {& Q. L#针对训练集,利用多元线性回归模型拟合数据。
    8 a) y+ L  S' Z/ }- }6 alm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    * w4 m8 a# m5 }  p0 x' j7 S0 A6 {$ e9 v: J) C! Z7 o. k
    #3
    0 o' {# D5 I; |5 V) s" m! }; `#对(2)中的多元线性回归模型进行诊断,处理异常值。" X: z9 A* a& _! @
    summary(lm.xy3)
    ' q' Z9 K* {" T, {# [par(mfrow=c(2,2))
    7 W2 N+ p0 P0 I! Hplot(lm.xy3)
    0 b: r+ Z2 [) h9 toutlierTest(lm.xy3)
    $ C2 \) j9 b/ Y$ {8 }2 k+ s3 XtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的1 _; y6 \1 W9 c$ A, a

    , z4 d0 i9 E% g' \+ g: ~#4
    % Y6 I& U. J2 t3 U5 Z#对(3)中的多元线性模型进行多重共线性检验并加以处理。+ O  A( e/ E4 e2 |7 f, d: W, T
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    4 X( o# P, p, \9 a9 |( @- y5 Vsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    9 D, p6 o. P5 G* Fx2<-trainData[,"x2"]. ^: O( v2 D8 F
    x1<-trainData[,"x1"]8 L: T/ C) |1 r* k* P" R
    friends<-trainData[,"friends"]0 c9 I8 j; q  S+ s, u
    lm.xy3 <-lm(salary~x2+x1+friends)
    7 u% {. x9 N! T% |0 K  m& Q7 B  J- G$ W. ]+ ~' q
    #5  I) \) q$ J2 B( f" Q# w( O( k
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。* P' A4 o3 V$ c8 c: b" @. g
    #AIC检验,赤池信息准则,选择最小的" e- ?  X* `5 G
    AIClm<-step(lm.xy3,direction="both")
    % N9 r" S( {& e1 \' Z9 m3 O#BIC检验,贝叶斯信息准则,选择最小的% f0 }8 r( R: v, K- @) S5 ^/ R( e
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")9 f! c& a! ]" h; ~: A
    # T8 Z$ S& M; n& d' D3 F
    #6
    % K9 r) H+ D: s+ c! t  ^& ^2 j7 ~#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    * K3 Z3 I5 u5 V' A- x#这三个模型预测的准确性大小,并进行解释。2 u5 H+ U! V& `& G2 j
    Allmodel<-predict(lm.xy3,testData)
    $ g- k/ u8 v- B5 \% r, m% _AICmodel<-predict(AIClm,testData)
    - Z( o7 p4 y7 A. n9 z8 p# HBICmodel<-predict(BIClm,testData)
    & ]0 g0 X2 ^9 i" A  S* C#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    ' |2 {( U9 K  p5 F#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    5 ~! D, o3 q* a: s( D4 L#标准误差能够很好地反映出测量的精密度
    4 \. ~4 U5 `8 Q1 e3 zMSE <- function(x){2 x) h; a' F8 D' G/ d, T% R
      mse <- sum((testData[,"salary"]-x)^2)/50: c! A* N0 c& P% Q7 [
      return(mse)
    ) j( T% R7 y9 @% \! a8 _6 B. E}. z% [3 d$ U& s# z! @
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的3 k7 l5 R3 O) a# R* F, V( f# ]
    MSE(BICmodel)
    8 C8 e8 {; r( N* q4 IMSE(Allmodel)2 a2 v% \- K8 Y% }1 t$ i6 X

    ' a2 Z6 [# o) H/ Q  N
    - i; r9 |  u8 Z) ?5 T& r
      u- R" \* c. D
    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 20:14 , Processed in 0.764896 second(s), 56 queries .

    回顶部