QQ登录

只需要一步,快速开始

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

    一、背景) M" X8 G2 w8 V6 C2 E; l
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    ' q$ k0 ?# E9 q- _; Y- w# _#14 |8 K* W/ L( a6 [0 o7 g
    #展示数据集的结构
    ( `2 s6 v* f6 ?" gdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    % w4 v$ U: z! w+ `0 Z  Z& gstr(data2) #显示的结果有一列是多余的,需要删除2 K. C; m9 U7 y! B. w% X$ ~9 F
    data2 <- data2[,1:9]
    5 d" ?$ P" y/ g$ ]str(data2) #删完之后的显示效果是正常的没有多余列
    4 u+ g$ `9 \% @% ~$ X* Y; N1 c- i* v2 Y9 ?
    #2
    * D6 l  _8 K& q) {3 z#显示前10条数据记录- T4 r6 ~3 l: f6 c
    data2[1:10,]( q; M, w& {4 Z( Z. t

    & P* v( ?& Q& j4 h% ~#3
    - N5 Q: m& Z7 c/ |0 s# e1 V#将变量名重新命名为英文变量名4 h# m$ ]# g9 e7 A: M+ J
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    $ b' k: N& R1 F. B1 K2 r* tcolnames(data2) <- cnames
    5 l! R" V4 }1 Z. a1 RView(data2)! `) b# B8 W! o" F% b8 H7 S8 |

    8 C7 [. X2 _+ K$ m: E6 V#4- z% H, r) ~# l
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录! r) N. d+ l  r' D5 V
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    7 h% b* u3 Y8 l! Z; ^7 o$ S* n#View(x2) #①先算出居住时间7 _0 y# v' b! R4 _9 Y# c
    data3 <- cbind(data2,x2). s' L1 D; H: @0 c/ J' @% H( M8 K2 X
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
      V) i; m9 h2 {* @8 K2 glist <- which(x2<=0)
    2 y  B0 ~3 U: {+ j! |3 W! H7 hdata3 <- data3[-list,]
    ; j* i" n9 J$ q3 Z0 o$ E3 s$ HView(data3) #删除异常数据后是125条数据8 F2 I! S# J" f8 ]6 b3 M. z' g
    + O  G) C" n& M+ E
    #58 E9 @5 d+ _2 }0 G
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    & e" _7 Q6 ~1 J% l( s& L7 plibrary(lubridate)
    ( |- ]$ y- y$ M  s( x* l. X' adate<-Sys.Date() #返回系统当前的时间
    + a% _8 y8 X9 y+ k+ ^% dnowyear<-year(date) #提取年份
    4 x) ?$ w  Q1 j" |! anowmonth<-month(date)  #提取月份1 R: N. C8 |. L$ W
    #View(date) #查看现在的日期% ]3 V4 E  W" I4 B& P( j: ]
    #View(month(date)) #查看现在日期中的月份
    . v+ W: @  [& vx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    + G5 j5 l9 J/ s' G% Vfor(i in c(1:nrow(data3)) ){
    * G" u: x; o' v6 f' \1 m0 E% d0 G  if(nowmonth-data3[i,"birthmonth"]<0){$ n- ~6 B9 X8 y4 c% g& S7 W
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    9 I7 ^; `" R5 u( r- R. H  }else{8 ~' Y9 q: E, v$ N& t7 h/ g
         x1[i,1] <- nowyear-data3[i,"birthyear"]9 Z7 w4 @* b: Z3 F4 t; K; p
      }
    1 l1 _5 s# d: P* U/ A0 u}
    : l8 D8 [$ E' c- M% F#View(x1) #算出年龄x1,并加入到数据表中
    6 J4 N4 v. L6 x4 }, Cdata4 <- cbind(data3,x1) ; R' d; B* g: k: @) v+ T
    View(data4) #加入x1年龄变量的新表展示5 p7 ]: P9 L0 _/ k" t
    x2 <- data4$x2
    * ~+ T2 V' r+ |5 _, x3 P7 FMean.x2 <- round(mean(x2),2)5 q( H  W+ |9 x4 n# s, s1 ?6 i
    Min.x2 <- round(min(x2),2)
    / x& v& p/ J3 S6 J; U$ t' x' p8 S5 MMax.x2 <- round(max(x2),2)) b6 p! I+ \+ f# S5 T/ T
    Median.x2 <- round(median(x2),2)# ]  r) G. X5 L2 B0 o9 X, c
    Sd.x2 <- round(sd(x2),2)
    . c: ^" T+ o4 ?- H/ T6 R3 a3 Icbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    ' A, G7 ?9 {2 H9 |& WMean.x1 <- round(mean(x1),2)" m8 {3 A1 n) g* i2 b$ n
    Min.x1 <- round(min(x1),2)+ x  |( L# S9 A& E+ z
    Max.x1 <- round(max(x1),2)" u' `8 X2 ?- P' o* g  k( n2 D
    Median.x1 <- round(median(x1),2)* y% w+ {3 T' n$ A
    Sd.x1 <- round(sd(x1),2)
    6 z2 B. X2 i9 icbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果: `5 a/ L  Z5 |" I! Z2 r
    x3 <- data4$friends
    3 e4 x3 B3 Q' o, j3 R5 f4 b% E( tMean.x3 <- round(mean(x3),2)9 W3 K  k- |/ t: i
    Min.x3 <- round(min(x3),2)4 i3 N2 S, q/ ~( k6 z: y0 O
    Max.x3 <- round(max(x3),2)0 k% v/ t9 P7 ^  D
    Median.x3 <- round(median(x3),2)9 A" ?, n( O9 L) |# z4 _2 i
    Sd.x3 <- round(sd(x3),2)
    - P. D. x, Y7 w+ Z- l: qcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    $ t) ~+ e. ]8 {2 t  h, py <- data4$salary
    - N& z, H" ?+ F+ ^3 ZMean.y <- round(mean(y),2)& e* e, u5 z& C( J2 t3 Y" C
    Min.y <- round(min(y),2)' ~* l3 V2 _8 `  W' @* k
    Max.y <- round(max(y),2)
    0 \7 n6 P* a. r3 zMedian.y <- round(median(y),2)
    9 {, ]/ b& o# S+ PSd.y <- round(sd(y),2)
    . O8 o. S; X, J& Dcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果" A0 m$ e% x) G. W: N
    8 v6 B2 P* }  x# _9 u0 E# s/ T# a
    #6
    " x7 R5 x( [+ o#计算数据集中因变量和自变量的相关系数,要求保留2位小数。* O: x3 l* G, Y' {$ }3 Z2 }" a
    round(cor(y,x1),2) #y和x1年龄
    - }# l$ a, X& fround(cor(y,x2),2) #y和x2居住时间
    6 N$ P8 [, W! u5 K/ Hround(cor(y,x3),2) #y和x3朋友数量1 O) s  v' N% U- D- J0 C

    . k5 Q6 c' H5 p, {9 \: M" M/ Q#7; S; F( F5 Q7 d
    #分别绘制数据集中因变量与各个自变量的散点图
    + j: W3 h2 u! vpar(mfrow=c(1,3)) #布局,一行画3个图
    " K/ R; g6 n: gplot(x1,y,xlab="年龄x1",ylab="工资y")7 S, w! n1 }. Z" s* g' Q9 }
    plot(x2,y,xlab="居住时间x2",ylab="工资y")4 k9 t# O$ Z; z! J. [. V
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    % M+ M" Z) p5 r/ p. }; p: w' O/ g0 @! M- C( _5 l; E( b* y
    #8
    2 I5 D) i8 J$ {#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。- W0 i  H& i' g
    lm.xy <- lm(y~x1+x2+x3)
    4 F. \) N- e# U7 G, Jlm.xy
    7 D# m* N* f7 N% s# F& Ksummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    5 r* x3 _4 J6 ?# b& L
    0 I0 `+ \! c+ U1 J5 n#9
    # {- U. l8 v4 ^#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    " g( [& n! c3 q2 o' j3 L2 `par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    * m/ j1 @  z' t#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布& ]/ g6 Q& G, P3 w$ W' z
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。* w& b6 S5 f8 J; U" g
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    $ u" I2 _) X; R0 _#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。4 A, s7 z6 W9 E) a
    plot(lm)
    4 Z6 r! k: y4 n. ~' Z! r; mlibrary(carData)# j" s2 v. V5 y$ Y, s% U
    library(car), h) T- X3 P! V
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点0 a: V1 ?- d- C. n

    6 g0 {' W8 K* ~) ^8 o+ C#10
    ! X( j7 n, n3 S% A4 W+ T: c#删除异常值记录后重新利用多元线性回归模型拟合数据。8 ?# ~1 g8 \1 g7 O7 A8 j
    data4 <- data4[-136,] #删除该点
    * t! y4 X2 @- C- s8 \9 P6 Qx1 <- data4$x1+ h: S, e6 T3 N$ J
    x2 <- data4$x2
    % l0 h2 Q' t; S' c/ V6 a3 lx3 <- data4$friends
    0 g, d$ T3 F/ k/ Q$ Ky <- data4$salary
    % Z. H, _2 Q, x, ^5 {lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    6 e4 r, E$ C0 M4 @3 vlm.xy2
    # ~) i* h( i9 }* v8 x& C+ [# A9 N0 ]
    #111 f$ M. y  s1 j$ j
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    / A* K: e) C5 Z3 Wvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)3 l2 _- `9 i& ]$ T1 L* t
    ) e/ L1 Z7 z/ U! \' r
    #12) u4 ]5 K+ ~% T9 V6 F
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。3 c& }+ O9 ^9 e, d  f
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星4 \$ L; W* Y6 |! Z& t3 `% x4 o
    ' F7 b5 \( ^/ O: S. ~
    **********************************************************************
    & x9 u7 C; m: s) U* [# q
    / |( e$ l/ l! [1 {二、利用多元线性回归模型预测收入
    ' Z2 b% b7 o% l! g# _) [View(data4) #124条数据% b+ ^) b  N4 _
    #1
      t! q; X$ h$ p' q#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    5 H" {4 ?# R: P! otrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    . x3 W7 s  U2 z# a: ctrainData <- data4[train0,] #训练数据
      @2 ^- F1 u+ y/ v0 z. K+ @testData <- data4[-train0,] #测试数据
    " }( j) ^/ N- D! n
    & U4 G  v/ y* f7 e9 Q4 H#2
    ! F$ O  C6 s# G6 I& O1 h#针对训练集,利用多元线性回归模型拟合数据。" S+ p5 P+ S/ c
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    # D6 `6 N# R5 L5 ]! |( Y2 O! j  m0 r; p' j3 n
    #3
    1 g  W6 n0 o8 i6 M  y: Q#对(2)中的多元线性回归模型进行诊断,处理异常值。
    1 Y: g/ s- f; E4 K& Osummary(lm.xy3)8 h# K- N+ C9 F3 p
    par(mfrow=c(2,2))/ P1 D: J, J0 Q
    plot(lm.xy3)( G) Q9 E5 d0 G/ t9 G
    outlierTest(lm.xy3)2 d/ @$ U  z$ [- W
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    # i0 g  ]* b+ a5 A% ~3 _4 g; K/ G' Q4 o3 }) t6 K( _+ N
    #4* T9 M" o# B% x4 _* l
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。5 h  z9 g* J7 F) R% V, H
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)5 _: f  |: Y* g! X# {8 j
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
      X; }  }3 H5 u; w+ W  V7 F1 fx2<-trainData[,"x2"]! F6 j5 t2 g8 k& u' q. ~. C
    x1<-trainData[,"x1"]7 I$ Y6 X9 B) }6 ]
    friends<-trainData[,"friends"]
    $ I2 b3 r1 }! ~1 slm.xy3 <-lm(salary~x2+x1+friends)
    5 X$ I0 c! ]- X$ F% l4 O& A
    + Z" a: ]" `3 b/ G. ?' ?! {* Q# h#58 a7 _; P: Y. L0 G5 q0 O/ R( g& t
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    1 y5 V1 ~2 h/ v7 P3 w; z5 ~! J#AIC检验,赤池信息准则,选择最小的, L& {& G5 k- r& a( `
    AIClm<-step(lm.xy3,direction="both")/ _7 {- }. q9 `% A. P; O. L3 T9 m
    #BIC检验,贝叶斯信息准则,选择最小的+ O- ?) R  ^; i4 q9 U, N+ e
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")* t5 @& x3 D$ |9 _" \  {3 Q& ^$ S! v
    / W  {: T2 l: J5 ~6 B
    #6# }* Z4 Y- G/ y6 X7 \/ H
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型9 ~8 \1 E+ _% v
    #这三个模型预测的准确性大小,并进行解释。/ K- n# f5 }9 Z! r! y
    Allmodel<-predict(lm.xy3,testData)3 K" @, h& Z. T1 h' b8 Z
    AICmodel<-predict(AIClm,testData)
    & l, ~- q3 F: D. _% \BICmodel<-predict(BIClm,testData)
    ) V( |7 A' l1 z2 `. X) r#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差: Y+ X2 _, a3 s( j/ y
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根7 s4 l+ p4 t8 }* R; a# F5 P' ~
    #标准误差能够很好地反映出测量的精密度
    ) {; e. t/ v9 m( ~% YMSE <- function(x){. k; N  w9 Z' B) \0 `% z
      mse <- sum((testData[,"salary"]-x)^2)/50+ U/ L5 ?4 T  ?* I
      return(mse)
    / D7 w) g8 B6 P, e+ k: C}
    3 r. V+ [# s# h0 B7 U: N7 y  WMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    . H  r5 s" _5 h7 \: NMSE(BICmodel)- t) m8 U2 p% P: t% c
    MSE(Allmodel)  a4 c/ b5 t# A+ j( {
    7 l3 h3 E  c, K4 V$ t/ A
    ; B6 M) p' B: U% U0 h# I9 [& ]$ b

    / i2 z# t1 k$ N8 w! w7 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-7-23 06:44 , Processed in 0.458277 second(s), 56 queries .

    回顶部