QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3352|回复: 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 F7 N5 b( d+ n
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    * a7 ]" {$ S' ^  u% g. t#1: m( t2 f7 h" k8 R8 _
    #展示数据集的结构
    / v& E7 e7 E- N7 R4 ?, t0 e2 Rdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    & ~! m# ^7 e8 b$ Estr(data2) #显示的结果有一列是多余的,需要删除$ I6 _0 k3 d' @# a' x( \# g
    data2 <- data2[,1:9]' G. U8 X+ |1 |! I
    str(data2) #删完之后的显示效果是正常的没有多余列$ a9 B! F4 h0 K8 z0 @. X
    + v) E+ v  [3 j0 T6 O
    #29 t# \" A4 |: h7 `, ~6 U
    #显示前10条数据记录) w  r! t8 n' [1 n
    data2[1:10,]. k+ m5 K/ n  x1 {/ ~
      S4 Y  T0 Y+ C- ^; K
    #3" M  k5 t4 f5 u  `
    #将变量名重新命名为英文变量名
    $ l8 u! Q- E' D+ J  J* K% {  K# G) ncnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")  }9 L% v- X: b( ^( M3 w0 T" `
    colnames(data2) <- cnames
    ) y. B2 f- |0 ~2 w" qView(data2)! ?5 p7 k. ~" L5 Z$ K5 Z. `* _
    ' T9 {! ]8 A' L) G4 V% l2 ^. z
    #4! U1 Z3 R( B9 J/ }, }( k$ C% ]5 z* d
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录5 n5 m; B- S0 Z8 S+ p: Z7 O
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))% J& V1 J; ^& s; e' n4 C
    #View(x2) #①先算出居住时间
    & f  z' ^6 K0 C" gdata3 <- cbind(data2,x2)
    8 u& r, H& V) v3 B( g#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    1 Z% n) m/ k* A7 N, G; rlist <- which(x2<=0)% S  p; n  d+ u; S  m
    data3 <- data3[-list,]
    ' M. |, e4 _3 yView(data3) #删除异常数据后是125条数据
    7 z, l4 O" ^) S( r
    * n8 w/ y6 l; g#5/ G! G1 N' P) X3 Y) Q! J
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。3 x3 H  N' d9 y) @0 Y8 w! U
    library(lubridate)
    % T! @% S  S3 ldate<-Sys.Date() #返回系统当前的时间; _& {8 ?% c4 N* ?+ L
    nowyear<-year(date) #提取年份
    * P0 T# w% Z4 c$ Dnowmonth<-month(date)  #提取月份$ w& ]: r; ^: a$ u/ T& C+ b
    #View(date) #查看现在的日期
    - J- Y$ I/ [0 D+ E( @! w#View(month(date)) #查看现在日期中的月份8 b, P5 |, M1 ?: V, U- x
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    # q% }) [9 W8 s5 ?; C" |9 Vfor(i in c(1:nrow(data3)) ){7 o4 E  _. b8 G
      if(nowmonth-data3[i,"birthmonth"]<0){
    / ^6 g3 V/ K, G& m* i. F# b+ K/ f     x1[i,1] <- nowyear-data3[i,"birthyear"]-17 }6 c1 ^4 w( _9 O9 O
      }else{
    5 P* G; E; I) e! a     x1[i,1] <- nowyear-data3[i,"birthyear"]
    0 u* \! ]# r: b0 c  }
    7 m5 `. l( Q$ D}
    2 e" z' U6 U# Y" _, l' X' t3 m" \#View(x1) #算出年龄x1,并加入到数据表中% X- L  _" C" X- r
    data4 <- cbind(data3,x1) ' i' t7 U5 T. V
    View(data4) #加入x1年龄变量的新表展示& {+ t2 v7 T  V! g0 A+ Y+ F
    x2 <- data4$x2  P% N. E* h$ W! w- N+ w
    Mean.x2 <- round(mean(x2),2)1 ?! m& ~/ j% L" o' p/ E3 K
    Min.x2 <- round(min(x2),2)
    - E' A4 P0 M/ b( l3 M% J5 DMax.x2 <- round(max(x2),2)* S/ |0 W4 Y7 V9 J
    Median.x2 <- round(median(x2),2)% z) ^$ a/ k* D, g2 t1 K
    Sd.x2 <- round(sd(x2),2)
    4 S: O, V/ p& f) t  ]3 zcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    . M/ }  c5 W0 n: l% U( a* oMean.x1 <- round(mean(x1),2)
    ) _  _) I3 w0 v: JMin.x1 <- round(min(x1),2)& k  l- L7 R9 @2 l# ?; E7 o. p
    Max.x1 <- round(max(x1),2); q: i0 Y: ]. L2 J* B/ a
    Median.x1 <- round(median(x1),2)4 i. X6 R& C) v! ?) I' M% g
    Sd.x1 <- round(sd(x1),2)/ b, l" s6 O: u) w
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果8 p. T8 w) O0 L) w9 M
    x3 <- data4$friends' L7 r1 t7 ~" r
    Mean.x3 <- round(mean(x3),2)- A* l* \* ~/ r; L9 y
    Min.x3 <- round(min(x3),2)
    ; t* e( H# {3 R, _# z+ oMax.x3 <- round(max(x3),2)
    ! v, y6 Y1 V! ~6 `9 WMedian.x3 <- round(median(x3),2)
      U) _# _9 l" A2 t0 b: ESd.x3 <- round(sd(x3),2)
    + K2 u" M' t. K% ecbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果8 E  p5 t7 N  {/ i# X2 r& i8 S2 D
    y <- data4$salary
    ) \! p: Y: i, M9 Y$ {Mean.y <- round(mean(y),2)8 D7 b) d: ?6 j8 t
    Min.y <- round(min(y),2)
    ) G( A9 v; s6 b! C$ }: G0 Y9 pMax.y <- round(max(y),2)$ y6 N/ J6 v$ \: Z, w) W- M
    Median.y <- round(median(y),2)
    & I1 i% c+ a: U/ v; x0 b1 Z# HSd.y <- round(sd(y),2)1 p# |. Q  {8 ~( ~5 S5 L, ~6 {3 }
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果' K3 {/ x  F- P* z; K! O

    ! c. C# V; a$ k9 y! s& X1 Y#6& Z8 Z5 H, H' D' m2 X5 g# i& ?
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。" [) G( U& _% M6 W
    round(cor(y,x1),2) #y和x1年龄
    1 E" i8 t, |/ G3 ~round(cor(y,x2),2) #y和x2居住时间- w, b' C) X+ P. \6 e; J
    round(cor(y,x3),2) #y和x3朋友数量% u# p% }- Y. p, E, E
    2 v& w8 b! e& R* i/ q
    #7+ Z: {) Y3 Z; T% Y. R+ ^2 \
    #分别绘制数据集中因变量与各个自变量的散点图
    0 @/ c# ^7 W% g1 ppar(mfrow=c(1,3)) #布局,一行画3个图+ D% ^: U9 N- O0 e; x( e
    plot(x1,y,xlab="年龄x1",ylab="工资y")8 z. F( A. k- ]) c2 [2 X) X8 _; i6 c
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    , {) y0 S7 [8 ]plot(x3,y,xlab="朋友数量x3",ylab="工资y")! @4 n9 ]( c3 b4 R& F

    ! L8 Y$ A9 `, A/ P% f- Y3 k& P#8
    - p1 H2 a8 B8 o#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    - `( g3 }# c0 Q; e% ^# Dlm.xy <- lm(y~x1+x2+x3)9 n4 z5 T$ L. G- m% M
    lm.xy
    / @' e4 i' _& {. i+ nsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    ( B7 r' u# y4 z
    # f/ J) Y$ }0 S3 t/ e4 o#99 `2 M5 o/ Z) K; v9 S2 K! W
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    7 d$ Y, M3 w6 E7 D3 c9 U4 cpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    + t; _+ \  k2 {#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布2 ?$ c; ]  D+ o5 J9 J
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。7 t% a) A2 I! E4 e! V
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    " v. C& g( A/ X# k0 N: ]* O8 {. t#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。3 @5 ^/ j: H0 s  C( d+ A
    plot(lm)
    . A+ K  b& p/ i6 w3 _6 g. Xlibrary(carData)9 x# [, B$ y! n8 a9 g, ?/ m6 d+ e
    library(car)& t, e% L" w; `2 F3 W
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点; Z' o1 u. J3 A- y0 _8 u& ~

    - a0 G" p; g3 i/ @4 _% L#10
    8 Q( z7 G; Q0 C; {' l+ M% C# X#删除异常值记录后重新利用多元线性回归模型拟合数据。4 L; \* ~8 {, @+ h
    data4 <- data4[-136,] #删除该点: ]1 \% {8 Q; V7 O  b
    x1 <- data4$x1
    . N2 M) O) ?9 Q7 |+ yx2 <- data4$x2( M& r0 P" l. h% e7 [# }$ r+ K
    x3 <- data4$friends5 s( H4 p4 z. W% c7 W1 [* Z0 e
    y <- data4$salary2 ^( z0 R& ]/ L4 r  }( H
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
      ]) x0 Y  J, Mlm.xy2& ~" K) i+ h+ z- [. ]( H

    8 U( J7 J! l! |8 J3 e#110 M  v8 {9 Y0 ^; a' G
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    3 h7 L5 k$ B# i% O- `3 o$ O2 e% Avif(lm.xy2) #p判断多重共线性0<VIF<10(不存在). ?4 B0 x. U# h  D
    ) H, R3 v; h+ M8 S! h
    #12
    ! s) }/ e) M( {8 z# v- B#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。0 b6 r5 Z3 d  e
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星& p; \7 y( S0 z" P5 b  r! A

    " J* C/ o7 B' t" g1 ^& Y**********************************************************************$ E+ R! Y% d5 _! Q' y# k' P

    $ g1 f# \' `$ B& V% d5 v3 d  Q二、利用多元线性回归模型预测收入
    2 I. a) d$ Z- W& d; G6 q) R' wView(data4) #124条数据
    : j9 b& T/ ?; w7 o# F+ n' m#1) h$ }: L& `4 o' z$ @# i
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    * y; N7 u3 k0 S. P+ gtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集: Y7 v; i# G6 B8 Y- h
    trainData <- data4[train0,] #训练数据
    " G; b+ h. B! L* e2 e% otestData <- data4[-train0,] #测试数据* B" E& [6 q* P6 F) j# \2 c

    ( a% ]9 T( V2 @9 l/ s3 z$ D+ z9 M# [#2
    1 B$ s$ N! X! w9 ~#针对训练集,利用多元线性回归模型拟合数据。7 T6 f- w- t& _  F3 ^- `- c  j
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"]): Z2 ~0 ]+ O- ^; _6 w

    ! f) D. e2 q; q7 a9 A5 G#3
    5 R! z2 Q( [% D; T3 ~2 M1 @#对(2)中的多元线性回归模型进行诊断,处理异常值。
    # K' q5 @$ U; }( z& Asummary(lm.xy3)
    " f4 P- A3 }% t. K# `par(mfrow=c(2,2))  c! \0 R2 ~8 Z# V
    plot(lm.xy3)% X% Q' c- j2 F( i9 w' k5 a
    outlierTest(lm.xy3)$ }0 F; b% ~; n/ U0 j" [
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的7 B# r( q4 Q+ J- w

    2 D2 ?, b2 L2 L& K- I9 _#4+ D- s4 p7 J, n7 R! c4 U
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    5 D8 ?+ d7 F) W2 b. x+ svif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    ' c0 k8 A3 {/ B3 F, isalary<-trainData[,"salary"] #引入的数据是训练集的数据! Z5 q( V' j$ T. b  U/ b
    x2<-trainData[,"x2"]
    9 M' D( V. w* V3 H( Y$ C& f8 f+ Qx1<-trainData[,"x1"]
    , p. A+ M& K& c( {3 J. ofriends<-trainData[,"friends"]2 y) u9 U2 ~1 @5 d* G
    lm.xy3 <-lm(salary~x2+x1+friends)
    " }6 ]7 v! T! S( e/ k; j5 N; p, z
    #5
    3 h: z/ f" P+ Z#针对(4)中的模型,分别利用AIC和BIC选择最优模型。) v/ b  Z7 p# `  H. d
    #AIC检验,赤池信息准则,选择最小的) h8 b- t# ?6 }
    AIClm<-step(lm.xy3,direction="both")# G  _+ z5 p7 y; b. u+ B
    #BIC检验,贝叶斯信息准则,选择最小的
    # d+ `7 i. y. s: N  nBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")- B1 \1 M/ v8 F" Y5 v

    1 H6 Q4 p4 ^  K  e% x# S#6
    1 {: f/ z  z; y9 |  s' }& t#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型' i+ s9 N0 K4 J
    #这三个模型预测的准确性大小,并进行解释。
    3 r) \9 D/ R( k! UAllmodel<-predict(lm.xy3,testData)8 s6 k; H  c& t$ K8 |+ G
    AICmodel<-predict(AIClm,testData)
    1 x+ {) o4 U* H* B. cBICmodel<-predict(BIClm,testData)
    3 P% J# r9 z' i+ w& W! j' `#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    ) U, y2 A2 Z4 K4 v#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    ! U0 D% h. h, P' @% |#标准误差能够很好地反映出测量的精密度7 L1 @  R- Z* Q) Q1 ]9 }
    MSE <- function(x){
    ; u) A$ x0 w, b8 t% s$ k3 i  mse <- sum((testData[,"salary"]-x)^2)/500 O5 m* J% O6 L& M1 H( T5 P
      return(mse)- ^1 o$ C) O) `
    }
    ' T8 @) ^2 ?, x) a2 T& VMSE(AICmodel) #AIC/BIC/ALL是误差最小的3 [, ^" C2 N" R+ o) a2 E
    MSE(BICmodel)
      c8 {+ Z: t$ K, Y3 r8 L( f/ f9 vMSE(Allmodel)* O, H+ q1 L) |9 p7 A- L& ^2 f
    : Y$ W: c/ h9 D) W* e

    ! @% ]3 g. f0 d  i5 P' |
    - D( f5 j9 I6 k1 w% a
    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-5-27 23:10 , Processed in 0.463667 second(s), 56 queries .

    回顶部