QQ登录

只需要一步,快速开始

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

    一、背景: O$ ?, }6 c7 h$ y6 A" a) w
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素& b7 p- O3 P8 v: q: g; ?0 U
    #1$ P9 s4 Y: G1 I6 h
    #展示数据集的结构. w# ?% @  F. v
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")  m) y6 i' R) {, S& r
    str(data2) #显示的结果有一列是多余的,需要删除
    8 R+ m' F1 V  I& e8 ~$ E& edata2 <- data2[,1:9]
    # a# \) O  S) _/ }% H# ?8 G9 ~str(data2) #删完之后的显示效果是正常的没有多余列
    % ]0 @# {1 s6 E) |8 Q5 J' ]  V- q' h( d/ {
    #2
    8 i. ?7 Q  W/ N. S; M# q3 N#显示前10条数据记录
    2 i: H$ a- ^) odata2[1:10,]+ T1 K* P; g( @

    6 @2 M' q* j" [#35 |, |5 I8 U* ~0 t! _! r
    #将变量名重新命名为英文变量名) X) m4 [0 O  q3 h6 j
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    3 f" S  W* a4 `  ]7 X9 @8 b: Icolnames(data2) <- cnames
    ) W3 Z3 J0 S9 J  [View(data2)
    % G+ u3 q1 Y; h' Y- Y3 u7 z, w% z% [5 q  Y  P2 Z
    #4
    ( v- C1 I( I7 H; y7 L& p% Q#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录( R" Y7 D$ V' @& w9 B, ~! V
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))) J) T* \, {+ r. J
    #View(x2) #①先算出居住时间  y! y6 ]7 a) _( f
    data3 <- cbind(data2,x2)  z1 w- V! [5 ]# x5 K2 G7 Y8 v, |
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条: B" {9 M8 f( f! o
    list <- which(x2<=0)3 C+ ?( P6 j  Y/ p' e9 W* m; k
    data3 <- data3[-list,]
    6 e  P' u) _- y% DView(data3) #删除异常数据后是125条数据
    9 \& z* e- ^6 r% r: U5 ~2 N
    - M, v% o1 L) v5 d#5; h- l$ P* o+ R, Y5 s5 O$ l% ]
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    " F4 c/ E1 R0 Y( @- Nlibrary(lubridate)4 w2 O% P0 w# Z1 Q) K2 s7 l$ H9 V" B
    date<-Sys.Date() #返回系统当前的时间
    3 H/ s2 X/ Y1 x$ }nowyear<-year(date) #提取年份
      z  M1 V- m; A& knowmonth<-month(date)  #提取月份% f' B+ t8 W0 I* f# v; {4 ?; T, l
    #View(date) #查看现在的日期- h" b* b- z8 u$ T) s0 H
    #View(month(date)) #查看现在日期中的月份
    9 l* p  @4 q; z# L1 \x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    4 N8 }  V- v2 _. }* @# Mfor(i in c(1:nrow(data3)) ){% B: m2 x+ s7 c7 {+ `
      if(nowmonth-data3[i,"birthmonth"]<0){% F* O6 }) q& g' V- z3 ?
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    9 [+ }2 f3 A* L! N  }  }else{
    4 S- D! [9 }$ j  i' @7 J; ~     x1[i,1] <- nowyear-data3[i,"birthyear"]& `7 L( {0 ]2 p7 p- M/ b8 R- E
      }
    6 V; a/ u1 {; i- }$ Y}
    ) W4 B% v7 p' A; A2 [( f#View(x1) #算出年龄x1,并加入到数据表中! u2 T  T* w& Q! z3 W" [
    data4 <- cbind(data3,x1)
    + {& \9 b  a+ `( A' A3 qView(data4) #加入x1年龄变量的新表展示9 p1 Z  `  `3 v7 L: u
    x2 <- data4$x2# i% c0 u. z$ }3 J
    Mean.x2 <- round(mean(x2),2)
    " ?' ^  x6 C9 n- t* d& o/ q0 ^Min.x2 <- round(min(x2),2)
      N: W3 Y& D7 W2 _: z* D. I( UMax.x2 <- round(max(x2),2)) u! d$ z% f7 H: b
    Median.x2 <- round(median(x2),2)
    8 {0 n0 C9 H3 W3 g+ ?9 @Sd.x2 <- round(sd(x2),2)2 T; L& z' K0 d' r
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果+ `4 K, E5 u, W
    Mean.x1 <- round(mean(x1),2)
    $ _4 E2 E7 V# ^) uMin.x1 <- round(min(x1),2)6 u1 k- S+ d9 D: D; }# G6 k
    Max.x1 <- round(max(x1),2)5 \1 v& ~" H4 N% T, V$ a9 v
    Median.x1 <- round(median(x1),2). u& j5 R. ^1 i
    Sd.x1 <- round(sd(x1),2)5 s( `+ w# ]8 i
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    6 f( w' v) ^% s* ?/ a/ e" rx3 <- data4$friends9 }5 _3 d/ A2 d( y
    Mean.x3 <- round(mean(x3),2)( ?7 R; F# O9 o$ ?
    Min.x3 <- round(min(x3),2)
    ! E7 {0 ~9 T$ h* g7 U/ Y3 Y) GMax.x3 <- round(max(x3),2). |/ q; Q/ W; \$ c  L- Z! E3 ?
    Median.x3 <- round(median(x3),2)
      C6 U4 H- n9 ^! E& WSd.x3 <- round(sd(x3),2)
    * b% K; W+ J* v/ u5 g9 }cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果# a3 Z  r: w% E9 P8 x
    y <- data4$salary
    ; h, C: ?# k6 p2 |7 fMean.y <- round(mean(y),2)0 s0 s& z7 J7 T5 q$ k" Y
    Min.y <- round(min(y),2)
    # c0 ~* z6 o  R# }6 I+ xMax.y <- round(max(y),2)
    4 q1 T( j4 X& R( cMedian.y <- round(median(y),2)! y: o. ^; \3 u) k
    Sd.y <- round(sd(y),2)
    + `- {, l% L& Q& d4 r3 I$ ^- G8 bcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果0 y, G% N4 @1 Y0 q9 J% v

    / Y" G  L) O- p; j5 R#6
    # ?& g; E: f. Y#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    2 s& `5 p7 G" U1 E  Q7 Bround(cor(y,x1),2) #y和x1年龄
    9 N3 v3 X/ M" Oround(cor(y,x2),2) #y和x2居住时间1 D1 I( o6 H' @  }  v+ q
    round(cor(y,x3),2) #y和x3朋友数量' z1 \( i- w$ g% d+ R
    % M/ i# N7 j- P. f; u6 a$ g6 E
    #7
    $ h0 _, j5 O' w- d* E) N#分别绘制数据集中因变量与各个自变量的散点图
    + G# ?: R7 h# j  ^, R  Hpar(mfrow=c(1,3)) #布局,一行画3个图# n  y( O+ V" r: `+ G
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    $ ]2 z2 Q# d/ t' qplot(x2,y,xlab="居住时间x2",ylab="工资y")+ _7 ?" c* J% s7 F; ?
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    8 ]6 h# T$ X  H% X3 h8 `; y
    + k: g0 f$ z7 ~' o4 l4 [( {6 l#8
    $ z/ V) N* A& i5 K% a0 z#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    4 {8 X8 E; c( O6 n( llm.xy <- lm(y~x1+x2+x3)/ c! O$ V( {6 L0 S% n) [6 k
    lm.xy
    " E, j% D, k( N  \, n5 ^summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    $ E* q4 @& |2 A3 R5 b
    4 e1 ^3 E/ s. Q7 Y#93 A1 _1 Q& V6 P1 N1 K% v
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。9 M# l3 q. J# J% ~$ k
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    ) c7 F' I9 t; h7 Y# o#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布% R8 o( z- N- ~. l
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。  o1 Q( i6 Z# S3 s# w' e, N! y8 [
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    1 z" ]0 P5 E9 N* u: @9 s* S#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    1 p+ W2 E; O% s' }5 F* b! Uplot(lm)
    - J5 W  B! N( Ilibrary(carData). ?" N0 g+ l0 }; F1 R5 F/ N6 E
    library(car)
    $ U$ e, q8 m4 T$ ?outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    % H( B3 ]5 O- w( {" o! l' r: U% q5 z! r
    0 j% L! ?, i2 e' E# D2 a# L4 C( q#10# ~5 J. s. p. }. e
    #删除异常值记录后重新利用多元线性回归模型拟合数据。% ~& K4 W) M( B# Z# C& _3 c
    data4 <- data4[-136,] #删除该点" [5 K  o* t2 x
    x1 <- data4$x1
    , q/ Q" {9 n9 _+ Hx2 <- data4$x2: n& g/ o! ~. Y
    x3 <- data4$friends9 B, Y( X$ q4 [4 V0 F$ k
    y <- data4$salary3 g/ s% t8 l& S3 U  G3 r
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    ; z7 u; F0 P& S7 alm.xy2
    ) w) i8 w: v0 W" V& S3 Q( k
    : c; j, V2 G% L, c( ?- o8 p#11
    6 H, `$ p: h2 A( K0 L! u#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ! q7 u; {  C( ~vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在); U' y" n. q; t7 {  U9 I

    . x, q# Q- G9 S6 X  z#12
    9 s# Y- p0 f# y7 J1 u#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    , i( K9 e& k: W9 c# c1 U4 _summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星( D3 S- I4 `% a" H# k( j3 D
    . E3 w9 h  Q( R0 A' N- {
    **********************************************************************  z; t+ x& ?5 @: }
    2 T: v( U9 X& @4 c
    二、利用多元线性回归模型预测收入
    9 c) T' ?& k# N8 SView(data4) #124条数据2 o& w: z. n) @( |* J
    #1& }' {  a8 T, ]$ i4 b' m
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。" D8 \( A& }1 P
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集& u  d' u6 M1 O4 D4 G  F( A# e" P
    trainData <- data4[train0,] #训练数据! _' _( d* x- e: p7 \
    testData <- data4[-train0,] #测试数据
    . {. ~& a4 K" l9 i+ ^" T$ i
    - l1 S" M. F+ J. r0 |#2
    3 Y$ |& M- B) u/ R1 T9 v#针对训练集,利用多元线性回归模型拟合数据。
    ) T& q# l+ T4 Blm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])6 Q0 K: K+ I) K' I
    0 z$ _" w0 U2 L3 s4 |
    #3
    : A  h8 h* B3 X. `#对(2)中的多元线性回归模型进行诊断,处理异常值。; z1 X( C6 K5 F5 p+ g* i; ^
    summary(lm.xy3)
    8 v& X/ R% W( T& Mpar(mfrow=c(2,2))
    ( g+ W% N& ^! l! g/ \6 Splot(lm.xy3)% R# @& S9 D. s; O! m$ h7 m. I
    outlierTest(lm.xy3)& Z7 `# z1 r& ~+ |! L& M. [9 D  M
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的- y0 ?! l! Y3 X

    : Z1 o' I0 W2 Y  P#4+ C; A+ Z6 M( K6 ~5 r
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。! x% ?2 ]& p7 |& B" f  f6 E1 ~0 ^: L) o
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    ( N2 W, s5 {$ O" a: ?1 O, l' Ysalary<-trainData[,"salary"] #引入的数据是训练集的数据4 ]" }- f2 ^( r0 M$ x
    x2<-trainData[,"x2"]
    ) Q+ ]$ p7 P) F8 N, n- Dx1<-trainData[,"x1"]
    $ i9 d0 j/ H& m5 f) Wfriends<-trainData[,"friends"]  K5 q$ P* j% |8 G8 j$ D8 b
    lm.xy3 <-lm(salary~x2+x1+friends); ]  B+ o0 w; Q/ h6 C

    " E5 `5 ]- d4 t#5
    . P1 o( L4 O4 m4 q7 A#针对(4)中的模型,分别利用AIC和BIC选择最优模型。6 i$ `$ \' z7 F6 r( [) [6 ^: l0 t5 h( S
    #AIC检验,赤池信息准则,选择最小的. @6 Z" ]' q1 r& S
    AIClm<-step(lm.xy3,direction="both")3 l; W1 z% }4 a. E9 G4 K
    #BIC检验,贝叶斯信息准则,选择最小的+ F+ e, a; _$ m7 F% X
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")  b0 c/ D5 |2 e8 `: i  @
    2 \* H- [# r9 i- j6 z$ V3 p
    #6& q3 k6 J7 g9 y) r2 l
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    0 U0 H: B. d+ P3 ?  q#这三个模型预测的准确性大小,并进行解释。
    / k& R: P& Z8 e% w5 }2 Z1 N2 tAllmodel<-predict(lm.xy3,testData)
    4 V7 R6 W' {1 C0 IAICmodel<-predict(AIClm,testData)
    & ?# z8 w: H8 a; ]5 _BICmodel<-predict(BIClm,testData)
    ; U" D+ u$ T, b5 p  H4 Z#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    / J6 d. l7 v8 b: E8 ]  j* T+ a7 m5 K#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, D7 q" w4 a8 v" g2 b/ G# V
    #标准误差能够很好地反映出测量的精密度
    % n; i& E3 D9 O) I+ y$ IMSE <- function(x){
    ! [- X. o( l- l7 l5 f5 L  mse <- sum((testData[,"salary"]-x)^2)/50
    + |/ R2 N$ k% B+ h: W: z# r7 F# o( `  return(mse)1 d* `4 }( d* |7 q+ ~5 P
    }" }8 [- z/ r  G. j' p. }% L
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的7 R0 Q$ q( j8 N( r( E
    MSE(BICmodel)
    ( X6 t! g/ z6 fMSE(Allmodel)
    1 i9 X% @; h, \5 o7 C9 C
    0 o+ C6 h  z4 K8 X  I) H" C& O) e
    . b9 c7 U0 `- L0 c" h7 R
    8 g0 ~/ e+ _+ M4 [, C0 W
    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-28 18:46 , Processed in 0.430183 second(s), 56 queries .

    回顶部