QQ登录

只需要一步,快速开始

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

    一、背景% H9 L# q* \. \5 I
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    7 i. L" R3 j3 k( x. [#10 D; G$ Z" i, y
    #展示数据集的结构
    $ e' _6 Y% Z6 y% d  ]1 `data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")2 X: @( `! `: I
    str(data2) #显示的结果有一列是多余的,需要删除/ Q, W8 ]; W4 O, \7 i7 Q
    data2 <- data2[,1:9]* j- ^: C0 q- x/ C2 @/ S
    str(data2) #删完之后的显示效果是正常的没有多余列# s% G2 n* ?6 Q( l. b& P
    / ^! I# _; w" D/ }  ^- c1 H  \
    #2
    3 I6 v+ A$ k; ]1 R. x8 g' B1 a#显示前10条数据记录. e8 t" i) C, M
    data2[1:10,]
    ) L0 Q' t* m- [9 G- H; Y( t4 m7 K1 x# b
    #3* ~6 P+ O. r* f5 s( p3 |) P& x6 O6 i
    #将变量名重新命名为英文变量名
    5 F) Y0 \" V9 S, A: J) a$ J7 `6 d! }5 acnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    4 m% x- z" b2 Vcolnames(data2) <- cnames
    3 |: H$ h+ t# w: ^5 m) M9 dView(data2)
    0 {. l: w9 u/ X$ r' p% l0 x* E# J, R# V9 a% f+ o' v
    #4
    2 A1 H4 E. ^& y7 `2 y4 v#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    8 I3 r5 |/ K/ d- U( bx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth)): l6 c4 A- h5 ^! _4 O3 K
    #View(x2) #①先算出居住时间" o- N% [* e& R& h: _& v) J0 r
    data3 <- cbind(data2,x2)
    ( \* ?# m9 l4 S/ C% i0 c" S) x#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条* V1 G1 c8 ~% j' B; k. k
    list <- which(x2<=0)9 t! t6 w$ d5 X/ b3 q
    data3 <- data3[-list,]  \* g5 m$ E' {3 f. J$ {9 `* X
    View(data3) #删除异常数据后是125条数据
      n& _& G3 @8 A( V! o0 V8 h1 `* m9 N' r/ n$ {  c/ T1 k/ Q4 \. d  n) n
    #5
    & c3 @2 M9 ?( k* B& [' o#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。0 y2 d! P9 A8 c
    library(lubridate)7 ?  R4 u; d% _$ m) R1 l( v
    date<-Sys.Date() #返回系统当前的时间! b8 H& m4 N* b  O2 N# }( U- s% b
    nowyear<-year(date) #提取年份* _) O7 G, @* i) \* B0 m! S
    nowmonth<-month(date)  #提取月份6 d" l4 w8 P& u, C) r
    #View(date) #查看现在的日期8 q4 Z3 N  |) y) K  I" G
    #View(month(date)) #查看现在日期中的月份
    1 X' D( ?2 @- a7 @/ {x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))5 z2 `8 G. S( y& w" \2 v  B
    for(i in c(1:nrow(data3)) ){0 k/ E) n: t4 ?( A2 @7 ?
      if(nowmonth-data3[i,"birthmonth"]<0){
    + m) s- j) D# b5 l( P; B     x1[i,1] <- nowyear-data3[i,"birthyear"]-10 }: l1 q/ I, ?2 @
      }else{  M# `' I: r. \* x2 e) [
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    6 q0 @* ?2 Y2 R! @) h  }
    % [$ B9 w, k) j8 C/ O3 C}8 b+ C" r8 A, g7 R3 `
    #View(x1) #算出年龄x1,并加入到数据表中: ?) o  _0 `( x/ g/ O* [
    data4 <- cbind(data3,x1)
      I' m3 N% ?* z& aView(data4) #加入x1年龄变量的新表展示9 t3 G# a- y0 o3 S9 ?4 Y
    x2 <- data4$x2/ p# y2 z+ Y, P; C
    Mean.x2 <- round(mean(x2),2)
      b3 w$ ]+ A  ?- K# r8 bMin.x2 <- round(min(x2),2)
    - C8 @5 g9 A) K3 }  e2 J# w6 SMax.x2 <- round(max(x2),2)7 J1 a3 E( Q+ I$ x
    Median.x2 <- round(median(x2),2)
    7 \# Y4 E+ h- e3 aSd.x2 <- round(sd(x2),2)  z% |% N4 E: [5 F4 g" X0 Q
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    3 _3 I. K- @1 w% ]- BMean.x1 <- round(mean(x1),2)
    ( ]& K/ P, Z+ lMin.x1 <- round(min(x1),2)
    7 H" g+ Q2 y1 qMax.x1 <- round(max(x1),2)" @7 ~6 c$ G' }$ |5 i) _6 i+ H( z
    Median.x1 <- round(median(x1),2)
    " x2 D+ p! Q8 o, W% jSd.x1 <- round(sd(x1),2)
    8 O7 H: \$ R$ b2 ?- ]: t2 zcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果1 g# [& W! S& q% I) Q6 N: V
    x3 <- data4$friends+ R+ n- }: v: s6 h6 _
    Mean.x3 <- round(mean(x3),2)0 d, W- C- Y) v; U
    Min.x3 <- round(min(x3),2)
    7 }0 S0 C& ]6 L9 T- K  lMax.x3 <- round(max(x3),2)
    # Z3 u9 ^) h: U/ zMedian.x3 <- round(median(x3),2)7 Z# ~- o7 D3 o: ~
    Sd.x3 <- round(sd(x3),2)
    - T! R( f+ t/ h6 \# Qcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    $ e# X. W3 g' K) s! @y <- data4$salary, [' S5 W5 `# i" `7 H- q; r
    Mean.y <- round(mean(y),2)* z5 [1 c, ?) v- a& A3 c, G7 d
    Min.y <- round(min(y),2)% t. m8 `: V  o& d
    Max.y <- round(max(y),2)9 U6 ?7 n# D3 I
    Median.y <- round(median(y),2)
    3 D) }9 F( o- v' {; o" nSd.y <- round(sd(y),2)" O% P2 @- v8 y
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    3 V6 i6 P8 X( B
    . k* w# P3 {9 h% E" A#6
    , C$ I9 W+ D! e6 D6 x#计算数据集中因变量和自变量的相关系数,要求保留2位小数。1 H1 b. Z: c+ `, w% j# G; d
    round(cor(y,x1),2) #y和x1年龄: D- U( e8 t# U3 F1 j/ \
    round(cor(y,x2),2) #y和x2居住时间
    3 l  L$ O' }9 V/ P) I5 uround(cor(y,x3),2) #y和x3朋友数量
    2 ]: _- Y8 `9 w! M7 D7 y1 A+ A2 E0 k' G7 B( w0 p
    #7' Y' |; x! l0 a: N% h" _2 z4 Q7 k& N
    #分别绘制数据集中因变量与各个自变量的散点图) b$ c/ L# [7 v' D% x
    par(mfrow=c(1,3)) #布局,一行画3个图
    / C: r$ Q, |! I) \2 eplot(x1,y,xlab="年龄x1",ylab="工资y")
    . Q7 B' d/ ?" v" S- ]plot(x2,y,xlab="居住时间x2",ylab="工资y")
    - ?3 m7 s8 N- t' l( }plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    6 y6 k- G, s, D0 `. v2 m# [* j+ |2 ~' E
    #8- G- n! T: M7 n! w( ]* i, v
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。# n) k8 S; X5 x/ |  g
    lm.xy <- lm(y~x1+x2+x3)' @0 \2 I; o3 u" q# l4 F
    lm.xy- E( F0 w9 r* b3 z9 h
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    , K' }+ E$ d( A8 n+ Z; \, g5 \' e* d  _
    #9' f, z$ d2 o1 V; A' s) ?" r( H
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。- j0 l& T. {, ^
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    , @8 w' z3 @2 h  n  s. m. @; u#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    ( L2 `* k. e8 V0 q#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    % H! G! M* @9 l( i$ C2 K+ L#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    / l0 A' \" L" I  z) u#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。( ^" B3 D6 g' M
    plot(lm)6 m; x# C8 U; q/ z( }% Y
    library(carData)
    $ u2 @% e! |8 i+ @; @& @: E; Xlibrary(car)
    9 U) {& e4 o7 [) z& u% e# E2 i$ VoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点8 h: _3 f. l! O$ m8 N6 h+ J

    " a. L6 p* U$ f) {8 O# t" d#10, q3 q1 k" |! b) a( P* B
    #删除异常值记录后重新利用多元线性回归模型拟合数据。  K; A4 E9 T' |  p2 p* M: C
    data4 <- data4[-136,] #删除该点
    - U8 X( P0 F% M8 d' a$ a2 nx1 <- data4$x1
    6 i; E3 C/ g* C) Ix2 <- data4$x2* |( i, x3 L  q' V  u- |
    x3 <- data4$friends
    * H$ I* K8 K& J4 ]y <- data4$salary
    : ^0 G, M3 X0 N" a$ R6 ulm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型( t- p. X7 q( v/ W# ?) `
    lm.xy2: A7 u6 N- S) K5 R$ J
    , b7 g& K4 a. D5 m
    #11; e( O% ]( [: @* t- J
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。( w0 O8 d+ }8 Q
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)7 s, e: L$ Q2 p' j8 c
    # I4 H+ Y0 j: V7 E# _. G7 ?
    #12
    ; A( a! o( c( W#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    . \8 S3 |- [! K0 ]9 P0 Wsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星* \6 G0 r6 L4 K" U, _% ^% P

    % O. f) s+ V5 h* d, Q; b  E- M7 t**********************************************************************
    4 c9 j, O) ^& F. u
    - f+ x& W% B" Q  ?! g二、利用多元线性回归模型预测收入
    2 z. V7 Y! v2 O' O3 V+ NView(data4) #124条数据
    / [: N4 ?1 x$ e$ O6 y6 |% J#18 x+ R* ^$ _: F3 p. n
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    5 F- q2 O  E( R( S! y& t+ ytrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    : X8 ~8 V: e0 ?. ltrainData <- data4[train0,] #训练数据
    0 o- C; t: v4 s& rtestData <- data4[-train0,] #测试数据+ P$ [- K$ v0 P# r8 ]
    . x# X' j, D/ K5 m% q3 D
    #2
    6 E  _9 ]+ X7 z2 g% w#针对训练集,利用多元线性回归模型拟合数据。
      E; N+ w9 p* }lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    7 w7 L' }9 ~/ U
    ; V, f* d& M8 @" ?. u" |0 ~# ^#3
    6 p* a2 h  j& x4 q#对(2)中的多元线性回归模型进行诊断,处理异常值。( k; O* l: w$ B
    summary(lm.xy3)+ @' r! k' N2 D# R" \  c) s
    par(mfrow=c(2,2))
    " D: k, `% [# _; ~plot(lm.xy3)' j" K0 N: \4 [( n0 ~2 R, w4 i
    outlierTest(lm.xy3)
    # i6 f; Z8 `% FtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的7 ?- |) y; l2 I, e! F) s

    $ H- n9 R. u/ e1 f$ w+ \( l# g#4
    % P( n- i) T" Z+ B7 g- c  _  P#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    ' n. f' _1 f2 H! \vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    $ K8 \9 Y: F& n, @5 H- e/ v* Rsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    # u1 `: d+ h0 K' h- N# X( Tx2<-trainData[,"x2"]
    8 O9 g! d! F6 _: [: Gx1<-trainData[,"x1"]
    " \+ @" H7 h' q6 w& V; z9 \friends<-trainData[,"friends"]
    5 I9 L) z2 T4 |- ?  olm.xy3 <-lm(salary~x2+x1+friends)
    ) j& E4 R1 B7 Y- c7 G! I% p/ U
    : B3 _- g& M* e#5
    " d( z* A" @; N4 m' Q) u9 R#针对(4)中的模型,分别利用AIC和BIC选择最优模型。; q+ `6 u* R& U9 N
    #AIC检验,赤池信息准则,选择最小的- ]9 @' E) I% _6 K
    AIClm<-step(lm.xy3,direction="both")
    % a8 W7 j- g4 n$ H5 F( \* Z/ S: w#BIC检验,贝叶斯信息准则,选择最小的5 s5 K" v0 P- C8 G
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ; I0 V% \  i3 l$ @1 }; U
    * w2 c* c2 I# W/ I/ d- G: v#6, Z0 P' v2 U4 d5 s+ Q# c
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    7 O7 f, Q) f8 {2 f% K2 i1 Y! t5 U#这三个模型预测的准确性大小,并进行解释。0 K6 y1 b* u; Y/ U" q
    Allmodel<-predict(lm.xy3,testData)2 ^) p! C+ C1 z- c: g+ Z, Y9 G
    AICmodel<-predict(AIClm,testData)1 N/ Q1 Q% l- t; g  L% g5 C2 k
    BICmodel<-predict(BIClm,testData)! p- h+ B+ Y" w! z! l8 P% z
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差( M9 b- S( j. s9 l7 _
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, T( ?+ f; O# m( ^; p! a6 T
    #标准误差能够很好地反映出测量的精密度1 u; u2 S5 d+ l$ [% Q2 O
    MSE <- function(x){  G$ g! o- @6 `9 Z6 X
      mse <- sum((testData[,"salary"]-x)^2)/50% F, {/ \% g0 \  A7 z
      return(mse)$ m: i; O" ?0 u2 ?* D
    }
    / C# k& b: R. y. X2 C0 DMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    : ?  o: q% j( s% P: r3 B+ ~MSE(BICmodel)
    ; G* Z1 j) E9 y5 n( _MSE(Allmodel)! |" W. w) r/ N% `) s8 @
    - G8 ^. Z+ K( j8 D8 _

    ! V% u4 b6 t; {' a1 D
    " z+ W2 ^4 |2 p2 l: k
    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-12 23:14 , Processed in 0.430733 second(s), 55 queries .

    回顶部