QQ登录

只需要一步,快速开始

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

    一、背景
    2 V3 O3 o3 v8 `5 K% S5 D- w数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
      h* `( {+ c$ U1 z3 m#1( ?0 c+ V3 w( M( }  W$ O0 X* l
    #展示数据集的结构/ [; @1 {6 d$ m1 \4 N
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")5 s: G; L( B8 d: R$ e
    str(data2) #显示的结果有一列是多余的,需要删除- [3 a8 [7 _2 y
    data2 <- data2[,1:9]
    3 \, G4 g1 l. `' {& Zstr(data2) #删完之后的显示效果是正常的没有多余列
    " h" D3 }. ]' ?0 U& f5 j5 T
    # @5 p! Q0 h5 I& @8 W#2
    + ~7 w- k$ v4 X- r& W+ a#显示前10条数据记录
    6 A; p) F# L$ s" b* r% m% s* P& `- Ydata2[1:10,]8 d5 n" L7 N. t4 g

    + k& w1 K% P7 d#3$ K3 J1 z! l! d) F
    #将变量名重新命名为英文变量名; b$ w8 r5 q, B8 ]
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    ( u2 H4 [; c) m0 X9 [* zcolnames(data2) <- cnames
    $ u  A6 j+ H# k  N  @. A0 I# A3 GView(data2)/ E  z- v% I) W0 f% w7 [
    / o: `& [# H% V- t: ]! V
    #4
    ! q8 }# F6 [. c# f& n2 j8 [! P+ J7 F#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    ! R) T5 J5 o! W2 Xx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))4 m# S3 z9 y$ E2 g1 W' M5 u
    #View(x2) #①先算出居住时间
    $ |' X8 a7 D9 x8 J4 t2 }data3 <- cbind(data2,x2)7 y# `" H0 P9 Q& k
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条5 ], [8 q. y' d" G$ K* ~6 c
    list <- which(x2<=0)
    , s$ L5 V7 t; l/ ~data3 <- data3[-list,]
    - T3 a: O& R" j* H' tView(data3) #删除异常数据后是125条数据- Q- E, r/ J) u0 h

    . ]# a; V. ^( r& i#5
    , m1 |, ~1 {4 A* C! j. Y#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    * `2 K' u+ Y& n6 y5 |. Ylibrary(lubridate)
    5 z, F: C( {- M0 L2 ]& Ydate<-Sys.Date() #返回系统当前的时间! m+ Q: A" U1 c3 y; z, u1 Y
    nowyear<-year(date) #提取年份5 A7 P9 t( {; a  m" d6 B
    nowmonth<-month(date)  #提取月份6 u" L6 w- U5 B0 w3 M
    #View(date) #查看现在的日期
    3 O3 M1 E5 y, g( K2 r0 M#View(month(date)) #查看现在日期中的月份6 Y2 r9 {+ g% Z0 b+ A# @3 ^! P% x
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))$ Y9 ~2 l0 Q' D' J( Q8 O2 h' ?
    for(i in c(1:nrow(data3)) ){
    - o. k& c4 u( }; Y" U! d  l  D  if(nowmonth-data3[i,"birthmonth"]<0){# V/ [: J  @5 j- Q5 S7 ~
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
      C' t* h( X8 r: M7 z+ D; k% W  }else{
    . ]$ q: s: \6 k     x1[i,1] <- nowyear-data3[i,"birthyear"]
    5 J0 h1 I) _" t& |* j5 Y- Y  }
    , _5 l, z5 u7 y+ v/ w% U}; W7 M3 Z! z8 F8 ]2 o
    #View(x1) #算出年龄x1,并加入到数据表中
    # r, q0 }$ O2 S8 n. Qdata4 <- cbind(data3,x1)
    6 x8 Y. B9 k8 x' C6 @3 mView(data4) #加入x1年龄变量的新表展示
    7 D' e, t% y6 G, f8 _+ q. Fx2 <- data4$x2
    1 T- Z2 O# U/ P. [Mean.x2 <- round(mean(x2),2)
    0 Z1 I! \1 o: b* b4 _Min.x2 <- round(min(x2),2)6 A6 m9 K- X* E) w3 L+ I. T+ k
    Max.x2 <- round(max(x2),2)
    5 M" Z: Z9 J5 m. ~& vMedian.x2 <- round(median(x2),2)6 A$ c" T0 ^" P" g4 o! w1 f! Q
    Sd.x2 <- round(sd(x2),2)# Z/ L' N7 c$ {: J# m' h
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果9 e" ^, c: K" `. u7 Q9 F
    Mean.x1 <- round(mean(x1),2)* x$ I* ?. y: T3 }1 e
    Min.x1 <- round(min(x1),2)
    + u- i; ^3 j1 m7 JMax.x1 <- round(max(x1),2)
    ! S4 s3 M4 Y9 A2 R5 }Median.x1 <- round(median(x1),2)
    ) K& E: Z7 d4 J- B* h! QSd.x1 <- round(sd(x1),2)9 A! q+ l) ^; i" P4 ~/ U" ?4 ]
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    ( Y/ ]) O, f1 e9 rx3 <- data4$friends
    ! U/ L$ J# y8 H  x* aMean.x3 <- round(mean(x3),2). l- R; t4 V( V6 i: H
    Min.x3 <- round(min(x3),2), C0 F4 i- R; n1 x4 z  M+ F8 E5 }
    Max.x3 <- round(max(x3),2)
    % ]% y+ C( L) f& L" qMedian.x3 <- round(median(x3),2)
    2 ~( \6 `: g4 u& fSd.x3 <- round(sd(x3),2)7 w' q( E( z6 b( T+ [$ R8 t
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果" y1 g6 C: ^8 d- B! i) f
    y <- data4$salary
    8 ]& C2 `2 E" T* H" p5 L; AMean.y <- round(mean(y),2)
    ; v1 S3 k; o" S0 w' C7 UMin.y <- round(min(y),2)) w0 F! P" R' _$ {6 H  i8 b
    Max.y <- round(max(y),2)# W4 j) R( O9 F( R. ]" T
    Median.y <- round(median(y),2)
    # j0 ]% }5 z7 fSd.y <- round(sd(y),2)! S# _# i: X) O  L$ Q; @# _7 _; S
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果2 ^& g8 f1 }) H4 k1 v* J  ~; x+ Q

    % g! ~" d5 C' u" P#6
    ) ?7 `8 ~) F2 ?#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    / V  A2 a: M" ~& _5 |2 Tround(cor(y,x1),2) #y和x1年龄
    - Y* y2 ^, t0 f, A* w4 A: Hround(cor(y,x2),2) #y和x2居住时间0 @- Q5 @8 B4 [9 c: o2 ^
    round(cor(y,x3),2) #y和x3朋友数量; \" H& L# U, o$ n" B. \8 \

    / |) G/ v4 J  _. E2 o0 s+ X3 x#7
    5 t; }& t9 o' j# P2 k) a" _5 Q* K7 t#分别绘制数据集中因变量与各个自变量的散点图
    2 g8 G) L' \0 V) r8 z" n. ^! d$ fpar(mfrow=c(1,3)) #布局,一行画3个图
    2 r# B9 u' c* n, _' \* |$ E4 s/ vplot(x1,y,xlab="年龄x1",ylab="工资y")
    3 z  U8 s* s: @plot(x2,y,xlab="居住时间x2",ylab="工资y")
    * a* U6 N1 i5 L8 k, s. jplot(x3,y,xlab="朋友数量x3",ylab="工资y")- G1 W) N- M1 X* l9 _* V2 D% O

    $ L* C  z; G0 j! p# S% i#8
    6 k. [5 e; u/ i0 E9 e/ ?! M#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    ; h  F+ r% L7 {( Tlm.xy <- lm(y~x1+x2+x3)
    2 H3 [5 }3 X1 D8 H7 olm.xy
    % k( G" {: ?# y6 `0 c" jsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    3 u* K% _' J$ I/ v( e* H& v
    % t/ @2 ]8 N6 t: r" H$ N" p* I. w#9+ c* p' Y) m" [& f- ^' M
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    # A6 C7 j  G* C7 M& Opar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列  F7 v  @4 q" o) G# l& U
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    6 V  s% R! ^# e. u4 K#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。9 \6 z* G% p( Y* {' t
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。2 W6 h9 Z' y8 i3 {7 z
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。' i8 N: P: y5 `
    plot(lm)
    & V% i4 ^& B( p  t+ p  slibrary(carData)
    4 q8 O- i8 x. b5 j2 h4 elibrary(car). Z8 L& Z- z% `- `9 i/ r
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点* `$ G& F1 d% o6 T0 D
    # b+ s9 V& P$ u
    #10
    ( [8 H+ E* U1 I* B  d0 A#删除异常值记录后重新利用多元线性回归模型拟合数据。
    - T% D& N8 E4 n1 edata4 <- data4[-136,] #删除该点' G" X/ j8 _9 D, i( _) H9 X) t/ Q
    x1 <- data4$x13 f+ D# f1 f3 M0 G1 T% X
    x2 <- data4$x2+ ~5 F' c/ x1 G7 T
    x3 <- data4$friends# |8 Y: F4 s+ l6 X  R0 M6 p
    y <- data4$salary
      q' d( s) |: Y! x- `/ G3 X7 Clm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    # j7 X' U1 x+ o0 U( \/ ilm.xy2
    $ M8 m% L4 S: ~/ u! B! Z. ]  B# Q" l& q5 h) L
    #111 R% l$ I! s& C$ G( }$ ?
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。: `& p+ r* o2 F' r8 T0 r# X5 g5 c
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    8 y# W+ {) U3 [& d9 u& g3 W* ^! y7 D$ |$ O: R0 d
    #124 P; t, d" ^' p$ c7 W8 i
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。% y  R+ c+ O7 R. B
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    ! W/ V  u5 r1 m; r9 L- z
    7 n! N; q1 f* }! ]- \6 ^**********************************************************************" g1 k% F8 d1 b! v/ {2 t
    / v! j6 ?  Y& x7 e5 ^! v
    二、利用多元线性回归模型预测收入
    , v$ R! R+ x* F) h. KView(data4) #124条数据: c7 Z% |# R1 U% |
    #1& q& @! }+ z5 s9 T* G
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    ! r3 P. H4 m9 u6 z; E/ Z( H8 ]8 U; i% @train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    # i' J8 G. r8 X" X8 r; jtrainData <- data4[train0,] #训练数据! R1 t5 t. H  B& Y& ?% K7 g- q
    testData <- data4[-train0,] #测试数据7 l5 i7 C, X2 o: o

    " l5 f: w; B' }. E& L% m( g#21 z2 U+ R- [, X# G( h+ n9 I8 i1 |
    #针对训练集,利用多元线性回归模型拟合数据。
    0 P4 Z3 Q) F3 U; L& C% X# j! ylm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])2 ^6 v3 ~9 t- Q
    ! ^3 Y* w: _8 l) A
    #3
      n1 K' ?  a# p0 P#对(2)中的多元线性回归模型进行诊断,处理异常值。! U: f: w; W" z9 {/ i5 {
    summary(lm.xy3)
    * L& w- G/ A7 V8 w/ j/ J5 S; V, Upar(mfrow=c(2,2))
    * a9 g8 S7 g* W- s0 Kplot(lm.xy3)
    5 s% C3 r  @4 O" m8 a. @- ]7 HoutlierTest(lm.xy3)
    0 i; Z; O! ^6 FtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的; ^2 ~* K% @* {+ p- ]
    - V% o/ W! V( B: D' Y  N
    #4. o' H9 W1 \) R9 a5 P9 |: d
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。9 P' L1 b+ n$ \; ], M' w  ]
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    . s- d3 O+ g5 g+ dsalary<-trainData[,"salary"] #引入的数据是训练集的数据0 [4 s' u1 f- ^6 x1 a) _+ q
    x2<-trainData[,"x2"]
    + @6 C! Y, m3 u, z* Jx1<-trainData[,"x1"]! ~3 E4 \0 ]( k3 d
    friends<-trainData[,"friends"]
    . x# n( m$ X3 c1 q1 Wlm.xy3 <-lm(salary~x2+x1+friends)
    ( I" }2 x9 J0 n+ a2 N
    : Z) z- R9 R* |% W! A  d  f4 }#5
    # F$ i" {4 K+ W#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    5 I# t6 m6 g2 [#AIC检验,赤池信息准则,选择最小的. k5 |  S( k( @; J" T3 [
    AIClm<-step(lm.xy3,direction="both")
    0 T. q) x( B! I! L' F#BIC检验,贝叶斯信息准则,选择最小的3 [- L, @3 S# q7 J; K0 ]2 e
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")' H& e5 t: k8 l4 ~+ B; f
    # |7 z- s5 r$ d0 o, r
    #6  \$ T8 O1 n+ x; M1 `
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型& V* w' [" q' u: L3 z& ^. p
    #这三个模型预测的准确性大小,并进行解释。/ o( F% U6 G% E  i; u0 p5 B. Y
    Allmodel<-predict(lm.xy3,testData): z3 Q" e. |; Q  [
    AICmodel<-predict(AIClm,testData)
    1 y7 B+ j1 i  ~2 oBICmodel<-predict(BIClm,testData)% L  Q, V8 Q9 U1 s
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    5 V$ X& v3 z5 I0 v#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    ) a% ^% a2 R& K* i5 q7 i$ k#标准误差能够很好地反映出测量的精密度# U+ E- H- L8 \
    MSE <- function(x){
    * s; U6 x. b  S6 h1 O* j  mse <- sum((testData[,"salary"]-x)^2)/50) m+ _: G- P" Z" J' C
      return(mse)
    " d+ C$ E3 l5 p5 y" w}- C) a/ z+ v3 U: j5 n# A
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
      b4 K. a4 r( `% Y1 g+ ]  uMSE(BICmodel)4 z4 c* q; I1 E# }; p8 L
    MSE(Allmodel)4 ]+ V" u# Q$ {( ~
    , {9 W/ d5 L% k9 W* J) Y  _1 e$ k

    9 _- g  T9 h5 v7 |4 Q: b* x. m0 C* s! t9 Q* u2 T7 t; B0 ^
    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 09:00 , Processed in 0.564939 second(s), 56 queries .

    回顶部