QQ登录

只需要一步,快速开始

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

    一、背景
    - T1 G1 B4 d7 W% U0 w数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    * V" e* z% C2 D6 l#1
    3 ]7 D9 k& \; J) _#展示数据集的结构
    0 f8 N) p1 O8 k4 Bdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    * {* A$ A# @7 dstr(data2) #显示的结果有一列是多余的,需要删除
    6 P' o/ Z4 F5 a+ m1 a6 D2 _data2 <- data2[,1:9]4 j4 z; h3 Z, G6 N: G/ s1 l
    str(data2) #删完之后的显示效果是正常的没有多余列% T& y* z! b) h" s# w

    2 O* c& ?/ B, W6 S) ?; r, C#2
    + l# y& {* v/ b; @2 x#显示前10条数据记录/ z, X$ b1 x4 w% ?3 k% y
    data2[1:10,]5 |5 H1 W- `; H4 x4 }' y
    - |9 _* P# D/ `! e
    #3* G% v; T% V# H: e* G
    #将变量名重新命名为英文变量名
    8 h) P! I/ a0 C8 Vcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    ( x. H* o" n0 O) N2 A6 \$ dcolnames(data2) <- cnames# e8 ]/ O- J; C/ T6 y. n; L( V
    View(data2)) }1 x6 G- y% P% J$ T' E* H. J

    . d; ~& O8 y0 C! e0 G7 H#4( g' }* H- E0 U: |2 \
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录- w; K7 f7 E+ v- p$ h4 Q. A+ Y3 H
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    % o7 n& W5 p3 f9 e$ j0 s#View(x2) #①先算出居住时间* C/ s: w: U; `) h
    data3 <- cbind(data2,x2)
    $ T6 f( Z& I" S& S% L( {" Q#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条( h2 h2 q3 B1 C* R% }2 _
    list <- which(x2<=0)
    ; F  s4 c' t$ d0 B! U3 ?data3 <- data3[-list,]
    * O( r0 p+ R, E6 P- tView(data3) #删除异常数据后是125条数据
    0 N9 V" {: f1 _* E+ W% c5 S# U  s' a7 w7 W8 \* J5 ]" x
    #5
    % r- H9 W: Q/ d. M( A#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。: S4 F5 a' Y, f5 Y7 L
    library(lubridate)
    - U1 |- i6 C7 @date<-Sys.Date() #返回系统当前的时间
    & b- ~0 l) Z/ L  F; Nnowyear<-year(date) #提取年份
    - |6 K' A- ^" z7 t& y7 ^3 H: Y% Knowmonth<-month(date)  #提取月份
      T9 \. w1 G  u3 b5 [; t! O0 _3 J#View(date) #查看现在的日期
    % t! n! T' d* Y$ L% x( F# [#View(month(date)) #查看现在日期中的月份
    ' N& T5 f6 D. j/ [% z% j& cx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    , |3 h/ v( j1 M) Sfor(i in c(1:nrow(data3)) ){
    3 b/ s: X$ U3 @/ l4 [5 v  if(nowmonth-data3[i,"birthmonth"]<0){
    . O/ }/ y) l4 o8 U/ _     x1[i,1] <- nowyear-data3[i,"birthyear"]-10 C6 q: H( v& D3 h9 l6 b1 k. F
      }else{
    ( w6 G5 ]3 z& ?     x1[i,1] <- nowyear-data3[i,"birthyear"]: N0 t8 W0 N3 w6 D" H! |) D8 l
      }8 g) F4 ]+ b+ j3 }: n% w) p- R  T
    }
    ( p. L* I3 ^% V- }" f  n5 A#View(x1) #算出年龄x1,并加入到数据表中; W/ i8 O- c2 K+ T4 `, d
    data4 <- cbind(data3,x1) 1 w  d0 s; ?; r2 K* L
    View(data4) #加入x1年龄变量的新表展示
    " y* v% |. m* k# _- Y" [x2 <- data4$x2
    ! S" m. ~7 R% m( AMean.x2 <- round(mean(x2),2)
    ' V; U2 w+ g  H0 {( eMin.x2 <- round(min(x2),2)' [6 f7 P0 g% Y3 W! s( g$ ]' s
    Max.x2 <- round(max(x2),2)
    ( d. I* ~- K# L$ u! Q9 R+ r$ cMedian.x2 <- round(median(x2),2)
    0 q" @3 _: q# O7 WSd.x2 <- round(sd(x2),2)
    - M# R2 \' F9 b. k% F& Ncbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果' G" b- D. ^, j) T6 ?. G9 A+ p
    Mean.x1 <- round(mean(x1),2)& w' l: v, L0 b
    Min.x1 <- round(min(x1),2): h# l$ ]& O' M, y
    Max.x1 <- round(max(x1),2)
    ; u0 ]3 r. m0 _" G( P# w+ s3 P7 e# y8 cMedian.x1 <- round(median(x1),2)* n7 \( A- m  K/ }% I& L. X& ?
    Sd.x1 <- round(sd(x1),2)- c; G- B& @1 ?& m* g
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    1 G: o7 J( a2 x$ Z* K# Xx3 <- data4$friends
    6 Y& u/ T! D# HMean.x3 <- round(mean(x3),2)% x' I- j* C7 u8 S4 t: v
    Min.x3 <- round(min(x3),2)1 D5 V8 |( U! x/ \5 I
    Max.x3 <- round(max(x3),2)
    6 X, C6 }, e2 c* Y: R* v, C: q" ZMedian.x3 <- round(median(x3),2)0 [  Q/ D# i' `' N8 U% L7 s
    Sd.x3 <- round(sd(x3),2)8 ]  h, U' D8 ?" b+ Y8 z
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    ) P3 W+ f6 R7 u3 O  Zy <- data4$salary6 L: a6 x6 B6 _1 d
    Mean.y <- round(mean(y),2)$ p! f7 V2 l3 x& j$ l
    Min.y <- round(min(y),2)* Y0 y9 k" S4 p* F. D
    Max.y <- round(max(y),2)6 G4 r8 t& n  \% v& K. j
    Median.y <- round(median(y),2)
    $ e: K$ m! U! v& g& _4 v) jSd.y <- round(sd(y),2)
    1 i& O* W+ W& e7 `! Hcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果. e7 _9 d- A$ K; d1 X0 w0 m

    ! _$ `; T$ X; S  i) ]#6, b7 ^! N0 E4 e7 P+ E3 k
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。* @6 c& o- V% W- d. |
    round(cor(y,x1),2) #y和x1年龄) e% @9 Z* ]3 r8 H7 I9 r8 `
    round(cor(y,x2),2) #y和x2居住时间
    3 J+ G) J! z" V5 _) Pround(cor(y,x3),2) #y和x3朋友数量
    0 J3 M/ E) t) u" Y' g" l
    9 L. }4 q7 n  ^8 M#7
    + _. `% H/ ?) _1 c2 p) f/ b7 p#分别绘制数据集中因变量与各个自变量的散点图
    5 p! T4 X4 U% c, E9 x1 Fpar(mfrow=c(1,3)) #布局,一行画3个图) [" @6 w3 o1 g8 G
    plot(x1,y,xlab="年龄x1",ylab="工资y"), J6 M$ ^0 [8 ^
    plot(x2,y,xlab="居住时间x2",ylab="工资y")' T: h+ C! `) Y1 C* `$ i1 ]
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    * v" C! v8 L. N( H* z+ M$ S; x- i1 v& w4 e- o
    #8) V8 V4 K1 T0 p/ I- _+ u
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    9 L/ l* [) Z8 a7 i2 k6 ^lm.xy <- lm(y~x1+x2+x3)# I! K& P. H# v: l5 \3 w3 B
    lm.xy
    ' a3 F0 X" r2 V. w; Usummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    3 {0 @; ^% }! K3 [+ s8 g& o0 B' ^0 L) K+ N+ t
    #90 U% {7 x" B3 d$ U- o: q+ g
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    9 W$ P3 t: @& m2 U/ A$ h/ ]: {% ?par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列! ]8 s: \) ^1 }* `
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布, i9 P6 C' g7 @. t. n
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。! Z* m; C7 d/ @, X
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    ) j! `; K9 [( i- v! p! |5 Y#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。  O& S3 c* Q: G! E2 x* Q; N) }
    plot(lm)4 O' H1 }: V7 p6 F
    library(carData)
    0 |) r6 l# M, \' W8 h6 alibrary(car)
    # {* q" l( V. b4 N3 {0 Y; H- x# XoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点5 [: p" a: j) S% {

    0 U/ S% Z, M. t" b#10
    % c8 i& `0 m' O2 n#删除异常值记录后重新利用多元线性回归模型拟合数据。
    . L* S# V& ]2 Z6 H2 Zdata4 <- data4[-136,] #删除该点
    : o+ r* o9 _$ i( {) m9 ?8 z; Xx1 <- data4$x16 x/ W. p" W1 _$ i  L4 H  Q% N# d
    x2 <- data4$x2( I% C5 p; W) f# h0 T0 @
    x3 <- data4$friends
    ; _( h# y: f$ o. x# R" Z6 ly <- data4$salary0 y- f5 ~' g8 y% ?* V
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    2 N9 k: d2 @! J& h2 Blm.xy29 L% t8 C6 a8 h: _1 P, e! u2 \

    " f! o; v, C# q4 J7 x#114 @( D+ ~% O6 @
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。+ w* w( I' _" U) S4 H0 D
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)% O8 Q, k5 a0 B+ G
    3 M6 v9 x/ J- I/ R3 ?
    #12
    , S- y1 C4 c7 |5 A0 w#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    & c! t. F* ?- p. Jsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星; I- R/ B" T1 q% w& G1 ^$ n3 N/ Z
    ) u/ n* ]( S! {0 M' C0 r
    **********************************************************************) d+ q: h+ X  i

    ) W; I! A- e8 K二、利用多元线性回归模型预测收入9 l* t, k  {- m
    View(data4) #124条数据# p+ N( x6 H" Z  w/ n0 E& C: e
    #1
    & h9 \4 i' _1 p& `8 J' U$ u  j#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    ! p" K" l4 s9 [train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集9 A1 d  U: J3 I0 ~# \1 P
    trainData <- data4[train0,] #训练数据9 c5 `0 I% c9 ^) C
    testData <- data4[-train0,] #测试数据
    ' E+ ~; l3 }6 c8 h; U; E/ l. R* \
    & t6 G2 W) n* ?/ T, x( v1 S! u#28 o! A$ x. W% F5 Y
    #针对训练集,利用多元线性回归模型拟合数据。
    6 D3 [7 v+ I/ V& slm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])7 ]. U3 e+ |$ w$ M+ ?2 v  R6 U: L/ Y4 f& @
    % l2 b; r5 L4 m. }" l
    #3
    1 U5 E% T. A: s/ ~; W9 C" c#对(2)中的多元线性回归模型进行诊断,处理异常值。- p; W0 j" j* C9 ?
    summary(lm.xy3)+ m# W3 r9 ^) ^% d* s' ]8 `
    par(mfrow=c(2,2))
    5 y- Z4 m4 T' |9 L# Kplot(lm.xy3)/ r! Z" P1 I0 c4 q  s4 Y% W
    outlierTest(lm.xy3)- }8 d, r3 i/ q+ e
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    * _6 [# n5 E4 v& z
      ?5 F2 k3 i' X, Q#4/ n8 _9 G! K, P4 H% ^2 t
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    ) F8 u5 s8 R8 @, @3 V% f' Xvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    % H2 [$ q3 w* H( {0 w4 Lsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    1 o: }& O3 T- F: U: \" \, c1 _x2<-trainData[,"x2"]5 A3 e# J* s& V2 @6 d8 E4 l
    x1<-trainData[,"x1"]* X/ ]; f3 o' K$ Q, f, Q
    friends<-trainData[,"friends"]7 b, Z* L& q# @  W
    lm.xy3 <-lm(salary~x2+x1+friends), G! x$ G! t( l$ U, z- \2 G

    . M9 {, `2 W5 T5 b* V5 k. b#5: w% j2 e9 G, B) h7 F' R
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。: X) F3 K2 `' U( X
    #AIC检验,赤池信息准则,选择最小的
    ( o3 X* ]+ j& \AIClm<-step(lm.xy3,direction="both")# C& C+ t7 u2 n
    #BIC检验,贝叶斯信息准则,选择最小的
    ' I( L! _  L! k9 {2 E0 J, mBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")" J* ?# L3 u0 C& L: k2 ?  m# i* o

    " O& _. V1 M; s5 \& `% h/ [- q  w% J#6
    $ B0 {) Z8 m! G: z#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型( M4 D6 z% D8 v) `; G$ |3 K9 r
    #这三个模型预测的准确性大小,并进行解释。0 x* D- d$ Y  S: i- }0 P. @$ O! U
    Allmodel<-predict(lm.xy3,testData)
    & s( B2 E7 s/ D$ M' B9 SAICmodel<-predict(AIClm,testData)$ I9 y$ z7 L- l8 V' |, ?- h
    BICmodel<-predict(BIClm,testData)7 Y, [6 Z, h) Y, W
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差! o& Z  K) w! ]- D( `
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根& {* ~& J) p4 h* V# a( m
    #标准误差能够很好地反映出测量的精密度0 q& ?6 u8 M6 q8 i
    MSE <- function(x){3 v% q  ^. f' Y- `. w/ B" O/ P
      mse <- sum((testData[,"salary"]-x)^2)/504 \( u( J& s5 p" A( {
      return(mse)& [$ M8 W  Q' `6 q/ j* u
    }
    1 M, Q9 l4 r2 l+ g* u! J' RMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    3 ]9 F$ x) i3 f, d, tMSE(BICmodel)
    , g' V' `: H% h8 f! q9 e7 `3 dMSE(Allmodel)
    - F. F8 k  L6 Q9 J9 L1 V; ~/ P) U( N, C/ N7 M4 W  g7 ~
    7 f/ S  z, C/ b7 q; `4 k

    + X5 |% K4 {1 I! m  F" \& v
    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-4-18 05:37 , Processed in 0.455722 second(s), 56 queries .

    回顶部