QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素, J% ^# {/ f2 l
    #14 B( R/ e; [  }
    #展示数据集的结构' u! W8 J" w. D4 C8 C: W7 @
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")- A5 j0 O8 S; J8 u- q+ I
    str(data2) #显示的结果有一列是多余的,需要删除
    % {4 E/ V4 [2 ydata2 <- data2[,1:9]. t, A) A2 G8 a8 C2 M1 a
    str(data2) #删完之后的显示效果是正常的没有多余列
    ( X% Q5 Q7 N! y8 S. P! [0 ?; W4 M7 A9 O+ e+ |
    #2
    ' \6 ]! P2 E) e; J: r3 B4 [#显示前10条数据记录
    & B8 Z, L3 R8 m5 Idata2[1:10,]
    ! e5 P: P5 v' i( O. v5 D4 w& |) r$ L9 i4 }* o& E
    #32 F( r0 ]- s$ Y% a
    #将变量名重新命名为英文变量名8 q! g. {% e8 L% U  Y0 K& |
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    2 U- C! ^9 Q0 M+ c4 j. B. r7 ocolnames(data2) <- cnames" R" V  X8 a0 R" R2 Y  d7 f. h" m
    View(data2)
    3 y  V7 q! T6 {: L4 y' q% ]+ q: B8 ^9 t' {* M5 t* X; g8 D
    #4
    ( l# U- D$ g% P$ m4 X! y  a- i#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    1 B) G+ l& [1 h4 U* z0 O, w1 O( qx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))) C+ `. f9 L- O: y
    #View(x2) #①先算出居住时间/ K0 I5 E& W( r, t! n8 B
    data3 <- cbind(data2,x2)
    # w' J! x3 a+ @% y) H#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    , p' ]' g; d4 A/ y7 jlist <- which(x2<=0)
    / B5 y' p* u5 {4 ldata3 <- data3[-list,]
    3 {) b% H$ s5 e9 o( f0 n! F2 s3 ?8 tView(data3) #删除异常数据后是125条数据
    ) ^! w3 r( e$ E# {$ o1 G3 }# A+ V' F2 n8 ?+ ?7 v
    #58 O( K# m# C3 D: y* V4 V0 w/ {2 K
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。; w# U& m5 p9 d) J8 _
    library(lubridate)
    / ^1 r3 S# R( E1 N7 z) zdate<-Sys.Date() #返回系统当前的时间2 c& R, f* j( g- Q- [2 t
    nowyear<-year(date) #提取年份: a- z% L; G$ r( G
    nowmonth<-month(date)  #提取月份0 s5 I+ ]- R+ ^3 F* ~" N  B
    #View(date) #查看现在的日期
    $ w& ~: ?6 B- K7 {! ?: b#View(month(date)) #查看现在日期中的月份5 C4 H) z6 D$ n1 K/ D# X
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    1 i) d. r. X) K% Y- W) d3 ofor(i in c(1:nrow(data3)) ){( n: ~  e4 ]  G( Z3 T
      if(nowmonth-data3[i,"birthmonth"]<0){1 n9 R* N5 X8 f8 A% D" \' h
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1- x3 M6 F2 y6 O# J
      }else{4 y1 o0 q6 I6 f7 x" W6 ]
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    + T9 s5 U7 L7 }6 t6 O9 j- r3 X- K  }' y% z1 r6 Q% @. z! ?! o7 ^4 _
    }
    $ B1 I/ L$ m; T0 X% b* S' M" y#View(x1) #算出年龄x1,并加入到数据表中$ z+ ?9 E: s' p* R
    data4 <- cbind(data3,x1)
    $ n5 a& V! q+ T# e7 Y% mView(data4) #加入x1年龄变量的新表展示* T* B3 L. C4 r. J/ T
    x2 <- data4$x2% u5 x1 I& O. v$ L9 Q
    Mean.x2 <- round(mean(x2),2)
    , I, }* m4 ~# i  H( G6 NMin.x2 <- round(min(x2),2), T' W& M, O" h0 d! z2 I% c+ @3 v
    Max.x2 <- round(max(x2),2)9 e* X) [$ c* x9 {& v, Y
    Median.x2 <- round(median(x2),2)! [0 b# g: [. D! v( c& \+ B
    Sd.x2 <- round(sd(x2),2)8 B* U8 s/ O0 [0 q8 j  `* d
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果, f8 k( v7 L' [/ O( H
    Mean.x1 <- round(mean(x1),2)
    ! r! b' A; O" J/ ^# b/ \Min.x1 <- round(min(x1),2)5 O, k: {5 O: w
    Max.x1 <- round(max(x1),2)
    - e% {; t  u& N6 a/ [  W$ OMedian.x1 <- round(median(x1),2)
    2 e( S4 `( I' e, }$ ]! j. F* W+ i' LSd.x1 <- round(sd(x1),2)
    , {' e% F- N3 N/ \# M* I& C# x; u$ ^, Hcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    ; m4 F* K6 y1 j9 Xx3 <- data4$friends' _! y/ t  C* G! l
    Mean.x3 <- round(mean(x3),2)
    , }5 ]. g( k; lMin.x3 <- round(min(x3),2): Q* ?- B/ u- c
    Max.x3 <- round(max(x3),2)6 s- b2 y4 w9 x" `  B1 |/ F
    Median.x3 <- round(median(x3),2)1 B1 t5 u8 T9 w" v/ L; `8 _2 F3 y
    Sd.x3 <- round(sd(x3),2)
    + d  ~+ M/ M6 {$ b8 U5 @& \cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果( y( K7 r8 S  C2 a9 A8 o1 Y
    y <- data4$salary0 Z3 Q6 w2 b7 A# V8 @2 J$ n- D
    Mean.y <- round(mean(y),2)1 P4 x6 K0 T3 g1 n. ^; u" ?9 ]
    Min.y <- round(min(y),2)5 q! C% H5 g+ S
    Max.y <- round(max(y),2)
    ; }) b# F! R" W' H8 p, Y* wMedian.y <- round(median(y),2)" n$ Z- Z. @' e# |2 u; G9 F( S' g
    Sd.y <- round(sd(y),2)$ S; b# ?) Z2 K) b
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    - P* F! c% P! K5 s* y! I
    , S  t; U3 \  a$ G: `#6
    $ D; I: D" b2 z6 D% O& f( q#计算数据集中因变量和自变量的相关系数,要求保留2位小数。5 x# _0 b. c$ S0 g
    round(cor(y,x1),2) #y和x1年龄9 m  D* P' E) k2 }5 |
    round(cor(y,x2),2) #y和x2居住时间
    # O! t6 y  [, Yround(cor(y,x3),2) #y和x3朋友数量
    7 t4 k$ o  O. z7 c! k1 n. p/ \+ w2 b9 C3 s5 y1 u
    #7
    : ?& `* {& v/ a/ U2 g/ j#分别绘制数据集中因变量与各个自变量的散点图
    ! `( g2 w! j' Q9 D" \par(mfrow=c(1,3)) #布局,一行画3个图5 B4 ]5 m! G0 f& E# F" ]1 ?
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    / l; G4 Y5 y3 u% K! w# ~$ J! P( e, Uplot(x2,y,xlab="居住时间x2",ylab="工资y")5 _3 v# Z6 j# K2 p' {5 x
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")9 j- a" y8 E' B2 G( ?

    ! Z" k. A. ]) o& V#8: r) g) M* i8 H- {* P& ?
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。9 l5 f% O3 Q5 b4 B+ R9 w
    lm.xy <- lm(y~x1+x2+x3)- h( w% Y9 x. X* z/ P# ]
    lm.xy
      A1 ~) V/ |' u6 Qsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的) Q% }8 T* N5 ^& _! C( r. l
    5 g# ?* ~- J- k5 k2 ], V+ Y
    #99 E4 G/ F$ D; a' Y$ F: @8 M
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    0 e7 ~  C& M) S6 I- D) h0 \& Mpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列4 B, I8 V' ~6 D* N% K/ M
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    # I) w; }, L) w( L; t4 V#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    . u. \. X5 O* [3 D+ o7 j#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    % t1 e: {9 Q; ^0 c8 C+ J#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    $ p# I$ x9 ~) u0 T  E5 z, uplot(lm)
    . \% A# Y: Q1 ~library(carData)
    & J* |1 _. Q9 }, j  R- l! [* Slibrary(car)5 I/ A, L5 K- Y( E
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点8 i2 m0 r* v! T7 x

    1 D8 T" L  S% P+ g! h# R, w& r" Q7 I% h#10; b1 e! B, H4 ~/ s' r
    #删除异常值记录后重新利用多元线性回归模型拟合数据。; p3 U7 [, c4 k0 g, U( n
    data4 <- data4[-136,] #删除该点. k- Z- C+ u# e8 w0 B. U
    x1 <- data4$x1/ M9 N; y9 w( Z/ Y$ I! Z- D, F
    x2 <- data4$x2
    9 n' b8 _$ l" A: j! j9 w& Ix3 <- data4$friends
    4 t1 u+ b/ \, `0 a5 ry <- data4$salary
    1 v$ s6 {/ e. P2 a1 ]' zlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型( F% H& C0 Y0 ~+ T% L4 b
    lm.xy2
    " q0 G+ z7 @; X, P0 A; \& R- ?. s: |- N3 p1 y
    #11" i5 J! F5 T) {4 p4 P" }5 V* O
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ; |! {0 I9 [1 s3 T# @9 _3 C: uvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    & a  P. m0 E0 V. N6 e9 i$ I. b
      p5 B8 R6 e2 G' B8 m6 a9 t$ c9 Y#12" }; M& ^) m( c6 }
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    ! _, a/ h6 J. }* b4 osummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星3 |, _4 H- E' Q! ]) H8 X& y

    0 c6 R! y/ X2 q, [/ V2 p5 Y**********************************************************************5 f( m6 ^) M2 m/ j

    6 f( w' f( x% T$ B4 c4 K3 a二、利用多元线性回归模型预测收入5 A; j! R% f; r4 l
    View(data4) #124条数据. f, ?1 k) E! P# X* d
    #1
    ( ?, E/ W0 c8 T# j#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    8 [8 ]+ S4 p- v1 wtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集3 B' ^( w: U3 p6 {2 a6 l' \
    trainData <- data4[train0,] #训练数据/ W3 B; p7 A8 i& v& Y, v
    testData <- data4[-train0,] #测试数据
    ( [1 |8 |3 m2 F! J' n
    2 w  _) t* b3 q# X" @#27 o7 c+ j" J2 u  {7 I
    #针对训练集,利用多元线性回归模型拟合数据。3 j2 b9 G$ P: y2 |5 y" E
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    ) D, f6 G5 N( _3 h
    9 C7 e5 x) v4 j: G. p#3
    3 n( O) g; c$ z( r( V! B7 h0 W) ?0 ?3 I#对(2)中的多元线性回归模型进行诊断,处理异常值。' O1 H& ?/ T2 d$ C! ~( r9 I
    summary(lm.xy3)5 b  b: }# a) v: X4 @2 j2 _, m
    par(mfrow=c(2,2))* _1 p, I9 H6 [
    plot(lm.xy3)* D7 ~# S9 l2 @
    outlierTest(lm.xy3)
    % U, j, l' @$ }/ \trainData<-trainData[-c(150,32,82),] #删除异常值,随机的7 b! n$ l3 V* D  w2 ]; u+ Z
    8 r& n7 n6 M. `: b7 c1 S) f4 x
    #4
    8 }* e! Z9 ~; i, O) r#对(3)中的多元线性模型进行多重共线性检验并加以处理。& B6 J' G# z. n( M# `
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)7 K( A$ u# M& {& M. p
    salary<-trainData[,"salary"] #引入的数据是训练集的数据& `0 n& |1 o4 J+ c! L$ b
    x2<-trainData[,"x2"]
    % W8 h8 O' o8 |, o2 y" Nx1<-trainData[,"x1"]
    ; o) T8 Z' X3 vfriends<-trainData[,"friends"]
    3 l# ], @! M; [4 H3 B1 X; Dlm.xy3 <-lm(salary~x2+x1+friends)3 U4 H$ |: X' A

    ( O& _- f' @* \$ r/ C9 B; A( ^#5
    , b3 `8 T6 {5 B# [. w#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    3 S8 U2 q% w1 L#AIC检验,赤池信息准则,选择最小的+ O/ [! f# f% u* s0 J! U
    AIClm<-step(lm.xy3,direction="both")
    # u0 t: b; N) ]/ `9 h#BIC检验,贝叶斯信息准则,选择最小的
    2 g$ P$ n# p( hBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ; J# S, M) F5 s- u
    6 f& B) {" h7 P5 i( H" h6 {#6
    5 C7 b+ T  D3 A/ f1 D#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型! e! q! S7 d6 e" t9 X9 f
    #这三个模型预测的准确性大小,并进行解释。3 G. V* ^8 @6 K0 k  C  S- \
    Allmodel<-predict(lm.xy3,testData)2 k' D) X* _& L: Q7 w; F
    AICmodel<-predict(AIClm,testData). s% E$ Y- g- a1 a7 ~$ s" g8 b
    BICmodel<-predict(BIClm,testData)
    & L$ b1 a1 q. ]' q#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差# q+ i; }# L0 o5 M2 V' q
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根; C$ U/ C' G; a% l5 K
    #标准误差能够很好地反映出测量的精密度4 r. c! X% M; p8 f% W1 j
    MSE <- function(x){; O  I- S2 N0 {! T! D0 N
      mse <- sum((testData[,"salary"]-x)^2)/50" B2 g0 u* n; p% C7 _; K
      return(mse)
    1 K# E- C* V1 k4 g& A6 @: r5 l! i}
    ' V" m7 A2 Q3 ?9 s3 kMSE(AICmodel) #AIC/BIC/ALL是误差最小的% ]) W9 q+ C6 e- Y$ H" e: L
    MSE(BICmodel)0 k2 H; K0 Q2 Z7 \, _( E" B
    MSE(Allmodel)
    , M0 E/ M, _9 k! ]; `2 ^7 r6 a
    9 P1 I' A9 a2 c) _- H
    . f" u7 d0 H, U$ e$ ~- y0 w) c2 U9 c
    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-8-25 20:19 , Processed in 0.427401 second(s), 55 queries .

    回顶部