QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    / X7 \+ Z. l6 r, ?# i' C/ }#1' f# T) H6 V. O. y& s5 z
    #展示数据集的结构% ^0 ^: x; G0 _/ C5 I1 _
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    . ]( M( f) o6 Wstr(data2) #显示的结果有一列是多余的,需要删除, B0 F- {2 X7 [, F/ `1 W* {
    data2 <- data2[,1:9]
    6 }* q% e6 a0 `str(data2) #删完之后的显示效果是正常的没有多余列& j$ {/ S  u$ W/ `2 [

    , n) h$ t* ?( a+ c8 T6 h#2
    4 g* R2 E- r# ^$ q, Z0 K$ ]; z#显示前10条数据记录
    . c0 ]4 L6 j. {1 n! f! s4 l8 i2 ~9 odata2[1:10,]
    9 q4 \0 D+ U0 P6 W7 m9 f
    % y" M5 ~3 {$ e/ k#3- E" z' E  q" o- A
    #将变量名重新命名为英文变量名
    + v8 I- \1 y0 Z+ s/ V' n7 hcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    $ g( m6 C) r5 u) zcolnames(data2) <- cnames
    ! |& ~/ o# j0 L" n: i; r& }View(data2)! J$ s4 [( H, O3 M  g4 E1 A
    6 ^3 x+ `: B8 G& F3 F  t" ?
    #4
    8 x" C2 n9 r/ D, |- @7 d. g- A. D#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录6 F+ a* Z, c9 `2 e0 M; Y6 X
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    8 @  n- r1 N- o) _4 L! g$ W& T#View(x2) #①先算出居住时间
    4 l/ l3 x, C+ x- p% h! Zdata3 <- cbind(data2,x2)
    : m) F$ G" c% }6 S5 \; d& i( Q#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    6 q( ~2 T% L0 _$ W$ \1 ^list <- which(x2<=0)) a( \0 V2 T' g
    data3 <- data3[-list,]
    , h/ |; X4 L1 GView(data3) #删除异常数据后是125条数据8 O1 D" J* ~1 u4 g
    , j/ `8 f+ m; K! J% W5 j
    #5
    $ t6 w! X4 U6 w( u#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    - i9 n- Y$ C- S- hlibrary(lubridate)
    0 P) z- |5 U  _- |date<-Sys.Date() #返回系统当前的时间8 {" e6 P$ u  g. L  ^- q
    nowyear<-year(date) #提取年份( G! z. ?: L0 \# z' `8 y+ _* o" O! n
    nowmonth<-month(date)  #提取月份
    & H0 S$ t9 ]+ e: {6 ]% T& i( L! b# P#View(date) #查看现在的日期
    , V; r% d; Z" M$ L; g#View(month(date)) #查看现在日期中的月份& Z  k. P& T3 W3 h* o7 ~3 |4 P* `1 j
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    4 J" k4 A7 @4 }# N) Z7 @% ufor(i in c(1:nrow(data3)) ){3 \& [( O) I( X& @" p7 `/ a! i) q. L" K
      if(nowmonth-data3[i,"birthmonth"]<0){" k2 O9 I! i: E5 D& y* Z4 m; G
         x1[i,1] <- nowyear-data3[i,"birthyear"]-15 |  T; k9 u# A4 O9 \. A( I
      }else{0 O; l2 {3 `" O  C
         x1[i,1] <- nowyear-data3[i,"birthyear"]$ `& B6 B0 X# J/ D+ `# [# e
      }
    9 r8 x: b5 f6 i2 m, Q6 d9 s}
    / P5 q) k, |4 i% i#View(x1) #算出年龄x1,并加入到数据表中: ]" \9 `4 Y8 n) w6 D
    data4 <- cbind(data3,x1) ! W9 @( S5 f8 x7 A
    View(data4) #加入x1年龄变量的新表展示
    0 j3 ~' x5 b" B& v1 K1 @x2 <- data4$x2) x6 x" m" O) H) ]; m* l
    Mean.x2 <- round(mean(x2),2)
    ( v+ n( F# [6 BMin.x2 <- round(min(x2),2), K$ g6 E! B! I0 C8 w' W( r: R. U
    Max.x2 <- round(max(x2),2)5 a& @; T! F& g! g
    Median.x2 <- round(median(x2),2)9 T. [, k- d1 a5 }7 ^2 W9 y
    Sd.x2 <- round(sd(x2),2)0 \9 f1 n& }7 J) [- t$ ]
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果9 |6 E3 k2 Q1 e, L: a
    Mean.x1 <- round(mean(x1),2)- e: U# L, {" x; h! F. E
    Min.x1 <- round(min(x1),2)
    & _3 N0 w' k3 ]# V, ?Max.x1 <- round(max(x1),2)
    ( k' a/ z7 ^) Q& G( n$ LMedian.x1 <- round(median(x1),2)
    3 d' V6 C+ d  }7 [2 p; dSd.x1 <- round(sd(x1),2)
    " d0 K6 t4 O3 ]: P" Fcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    # ?( v' Q% r4 nx3 <- data4$friends
    " v8 F0 ]; L8 @& m. w8 B& IMean.x3 <- round(mean(x3),2)
    + g1 N) `" d1 _* F6 N( ~Min.x3 <- round(min(x3),2)* @5 O% w2 v7 `7 p
    Max.x3 <- round(max(x3),2)
    ( p% y" z+ U: pMedian.x3 <- round(median(x3),2)& o/ h: s8 O2 r& ^
    Sd.x3 <- round(sd(x3),2)
    7 ]4 E0 y+ d# D' R' l7 _4 U# J/ Ycbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果1 f0 M) R1 W7 q! v7 J6 x
    y <- data4$salary
    3 c. h2 d% j, F9 x, `" |2 yMean.y <- round(mean(y),2)
    " c' d( H  {8 |  U: N9 r& @5 uMin.y <- round(min(y),2)5 m, _- m8 A2 ^3 [7 O! \
    Max.y <- round(max(y),2)
    8 J% R$ s, K) v6 e3 L9 V/ _Median.y <- round(median(y),2)& v  U# i# k; k9 u; A
    Sd.y <- round(sd(y),2)( l2 V; J9 g) o8 @% D/ j
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    / R6 \7 C3 N( J
    : |, P; o6 v- G4 _' S#64 |% s( @7 L' q0 D$ u
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。4 I0 O5 K/ L( g3 t
    round(cor(y,x1),2) #y和x1年龄0 ~7 P) p, R/ x/ b7 X
    round(cor(y,x2),2) #y和x2居住时间" t6 \+ r5 K! H0 n4 d2 H
    round(cor(y,x3),2) #y和x3朋友数量7 [& I* D! h4 [2 U, E

    : J4 b( l$ b( ~- w1 A#7+ h: k8 s9 W$ Z, }
    #分别绘制数据集中因变量与各个自变量的散点图/ p- I. S0 h. |1 }  R) W3 j
    par(mfrow=c(1,3)) #布局,一行画3个图' m2 l$ Y+ N% ^) q1 O
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    3 g7 j( j* v  }2 g! z  Xplot(x2,y,xlab="居住时间x2",ylab="工资y")% T6 H0 z. K# {0 v$ U1 n$ `$ r/ _( M
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    0 [: A5 a* O5 g6 ^' E9 A! s- g. l, y) _) h. |
    #83 D+ C1 G. Z, P6 J
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    ' F8 E2 }/ P5 ?+ c- _2 W' hlm.xy <- lm(y~x1+x2+x3)
    . ~9 g7 {8 L: }, c$ \8 i2 |; _9 Ylm.xy
    3 {4 z3 k6 K; P6 {+ A' f% g; _summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的: \- ?4 @5 D: G$ N, e! a
    % O  C) _1 L( l; @6 B% F' U
    #9* h0 N* D( i! S- E5 A
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。& q& n: F3 e, P
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    / `" R# J4 J4 w#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布* t# ^+ S3 |% K& P: |/ B/ n3 L
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。9 u; v8 N) D$ M
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    6 I; I* j) L- @- M3 m: `! v#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。/ O4 {# L* {& f
    plot(lm)
    # H5 Y  a5 B. H5 ]+ M* o/ Z* _; Elibrary(carData)
    & Y4 k* A) @2 W7 n1 b. R" H4 nlibrary(car)
    # f9 x, o3 q& V) A# n, ^outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点+ w9 F' X2 U& v: n; R

    , s  S8 b2 K  J$ k7 V2 ]- o#10
    8 |- p/ |3 ^. e: o$ q+ \! ~#删除异常值记录后重新利用多元线性回归模型拟合数据。; y5 u( w' E  @2 D. y
    data4 <- data4[-136,] #删除该点4 Q, F) v( C9 T& L7 l
    x1 <- data4$x1% @. K6 ]1 y5 G, M, {0 Y
    x2 <- data4$x20 \! [8 j" Z$ q& e( t- {
    x3 <- data4$friends, z' S: k+ {  q& g9 r" ?
    y <- data4$salary
    # ~/ M2 E7 c1 q9 P2 F. l  N( dlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    / G% z' f" P. a/ k" [4 r4 |lm.xy2! r7 F1 z: I* }+ \/ g0 B" V
    1 T9 G+ _' \4 S  S7 g
    #11& K* o; }+ M( `: K4 ?7 V1 }6 d) Q) ?
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。- M( p3 Q% L/ a3 b7 p& j7 m
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)0 L( g3 k/ N. ?6 L
    1 d; e2 Z9 I3 b6 C+ m) X7 p
    #12
    " }, y* d. J/ c( j" {* f3 [! w#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    : p; V* N! i6 [" Y) ^, [summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星7 w. M, W  ]/ A  ~) X

    1 ]9 M5 r4 o" [% }**********************************************************************; w( U  w% @# f3 ?. L; E% p% S# @
    5 U: P9 j$ G" D7 J1 R- k
    二、利用多元线性回归模型预测收入
    + `, t* b' M" ?' _5 RView(data4) #124条数据; O% r2 d% s5 a- k, R# w% C
    #16 l) a/ U2 U# u; k9 H# R
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。; G4 R9 `3 n2 ?; s
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集& [- R2 H* s5 y  U" v
    trainData <- data4[train0,] #训练数据
    2 j7 J) b* I6 ?9 `$ ZtestData <- data4[-train0,] #测试数据; I+ w6 j3 l! O1 q8 ?% q/ t

    & |9 ]7 n: D7 v#2
    4 ^  e) p1 o7 V% H. H#针对训练集,利用多元线性回归模型拟合数据。  \# t5 b2 `9 v  H; J
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    * Z* }, o" I9 _" W  G& ^' s8 z) K1 T# C- ^+ t& `+ a% t
    #37 m# ?5 n: |$ A# |9 I" Y3 V9 L( G
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    0 Q, V) y5 A/ J1 r6 x  J5 D. psummary(lm.xy3)
    ) A1 d9 o' Y8 m$ Gpar(mfrow=c(2,2))
    $ P; T' @9 V# v, d4 x; [plot(lm.xy3)
    # d+ k0 o, d9 E$ i: z% N/ [outlierTest(lm.xy3)
    ( g" t+ f" `) U4 d) _, ^! f) BtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的2 r7 C, @. l# _9 W

    6 a! s9 t( E5 N" r. S/ A/ D#4
    ; q- A. I' ~0 C; O0 C  s5 V#对(3)中的多元线性模型进行多重共线性检验并加以处理。, f" r) D& D5 M
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    9 x2 V& @7 Y4 q+ Osalary<-trainData[,"salary"] #引入的数据是训练集的数据/ V5 ?- }0 i$ R. J2 [
    x2<-trainData[,"x2"]7 R$ Z3 R, ~* j$ e
    x1<-trainData[,"x1"]3 a, O$ E  M' z$ Q) Y( y  Z
    friends<-trainData[,"friends"]
    . \0 m+ x+ A1 qlm.xy3 <-lm(salary~x2+x1+friends), q+ f' U. }9 T* ]" `
    : F/ n* C2 v! A' d  Z. D  |
    #5
    ' o$ P9 y' s7 k/ O2 ]0 X#针对(4)中的模型,分别利用AIC和BIC选择最优模型。$ `- O. z: R# z) q5 E) K
    #AIC检验,赤池信息准则,选择最小的& g# @- h" U) A! m- a
    AIClm<-step(lm.xy3,direction="both")
    / m, U) b6 w7 {) N* c$ r, O#BIC检验,贝叶斯信息准则,选择最小的
    7 @. l5 a9 Z9 A" `" F0 JBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")/ B9 x# r2 h4 y
    0 _. h, y0 Q8 {% x. V: F( T8 n; Y
    #6
    ' N# M' P  E0 O/ Z- H% y* N; s#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    ) K$ V# o7 u& f# r5 J" c2 I, d2 g* {#这三个模型预测的准确性大小,并进行解释。! ?2 X4 l2 d4 X- o6 q% I( _4 b4 Q  Q
    Allmodel<-predict(lm.xy3,testData)
    % M( C2 K  _' Y7 ]( j$ ]5 tAICmodel<-predict(AIClm,testData)& P- t* n8 M* D8 ?5 \. @
    BICmodel<-predict(BIClm,testData)
    " U) }2 c- c1 \#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    6 O2 |6 i  r9 j$ X9 ?8 r8 X- z- {#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    ; O3 K+ ?/ Y0 ~. L0 R" P1 M#标准误差能够很好地反映出测量的精密度
    % G) S& l+ g4 ?+ P+ f9 M# r( DMSE <- function(x){
    + L% u6 s3 o( V4 Z: R; ~  mse <- sum((testData[,"salary"]-x)^2)/50! g  f4 e; Q# L) ]/ o
      return(mse)
      [) @( n5 P1 p+ ~( j}
    ( k$ s, b) X. P- T, r' kMSE(AICmodel) #AIC/BIC/ALL是误差最小的! z. r; h2 G/ ^
    MSE(BICmodel)& I0 q" P5 I% d% z  q
    MSE(Allmodel)
    & t# {0 z' G4 g7 d. y; m+ ?' S' ^/ U' f* |, Q  k  r& i0 ^% w+ s
    3 R2 J/ X0 X6 A9 `9 {

    ; C2 q0 l4 j$ J1 u4 e
    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-9-5 00:42 , Processed in 0.693343 second(s), 56 queries .

    回顶部