QQ登录

只需要一步,快速开始

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

    一、背景
    & e1 ~; s! r+ Q. K( r: s5 S数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    - ]* D; N$ q" s  m' i4 O#1
    * a" f2 G2 h5 z  r#展示数据集的结构
    6 b/ }: `- n- m) Odata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    : A, s9 i5 B* o0 R7 Q$ estr(data2) #显示的结果有一列是多余的,需要删除
    + _! i2 X0 V0 r2 Odata2 <- data2[,1:9]
    - X( x- y) i( T. |str(data2) #删完之后的显示效果是正常的没有多余列
    , L  L5 C3 z$ u1 d1 J& O; G: f' k9 |" Y" |# E( z
    #27 f+ A6 S: q, X) N$ Y
    #显示前10条数据记录
    0 M4 f+ W4 p9 W9 Pdata2[1:10,]
    9 V( n7 O& ]5 t% b7 v& [+ c& [9 l/ c' ]- r3 ~$ b1 ?
    #3; z5 a* \: D# P8 o. r- }
    #将变量名重新命名为英文变量名
    0 G" p: J9 d' M! r# Xcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    $ }  [, i7 F& I& fcolnames(data2) <- cnames
    1 Z* c% }% \3 J2 R% MView(data2)
    : m4 ^( k0 S3 k; b" ~" p3 ~% h( r: z
    #4
    6 v; ~; w/ Y& d7 x, X9 r# F#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    3 I/ ?& J2 z) p- R( }1 p1 E6 gx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    7 {# |5 b& E& }2 _6 g2 u#View(x2) #①先算出居住时间
    & o/ V! O3 L3 i2 N9 J5 Xdata3 <- cbind(data2,x2), n# r% w  ^2 ?
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条1 y  I/ _8 Y4 l) M' a
    list <- which(x2<=0)
    , w1 Z& q: F# a9 l% udata3 <- data3[-list,]
    % f! D7 `  B- I3 N, fView(data3) #删除异常数据后是125条数据
    . N% N' p- E8 r6 o) g5 _6 d$ h7 [- z9 [3 c. {8 j# x7 h! _8 y
    #5$ s/ o& [7 l1 W- E# a4 E- t
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    : y% W  T8 f/ N! x9 \- Dlibrary(lubridate)
    ' l$ G; |$ J9 b% a. Z3 w. ~date<-Sys.Date() #返回系统当前的时间* O+ E$ E; ~- C* i6 c1 P
    nowyear<-year(date) #提取年份
    0 S7 k# s1 z: R/ e. G2 H! w. K0 w. Anowmonth<-month(date)  #提取月份
    ; x2 J# [0 f: }1 D) n! ^& I#View(date) #查看现在的日期* v& \( v7 ?6 K$ f8 W  T: h- D5 U
    #View(month(date)) #查看现在日期中的月份5 n; C. A/ \1 x% n1 X0 Q3 a
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    - f, L. l+ v1 i3 _3 |1 Ffor(i in c(1:nrow(data3)) ){
    ) `+ \: \5 d! O1 o4 Z- p  if(nowmonth-data3[i,"birthmonth"]<0){
    ( \# }$ d0 Z4 Q  o; f$ E     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    + ~: T/ b, M$ H" k  |8 e# X% M6 u, X7 ^  }else{
    / t: h2 D) A+ n: W3 H; ?8 K% |/ {     x1[i,1] <- nowyear-data3[i,"birthyear"]
    8 z4 b1 U; H8 `* Z) N+ T% L# {  }- Q" H, L' k0 s) R* Y
    }1 }+ v( h% N/ y
    #View(x1) #算出年龄x1,并加入到数据表中
    % {: ^# ]& U. ~. ?/ {data4 <- cbind(data3,x1)
    $ Z% [! C2 h" Z  C5 G6 I3 T- R1 SView(data4) #加入x1年龄变量的新表展示
    : n6 y  P& R* V% ?x2 <- data4$x2
    3 v( ~/ ^( d' a7 J% Q7 o& WMean.x2 <- round(mean(x2),2)
    & q! S' G, ^! Y4 c* XMin.x2 <- round(min(x2),2)
    4 C+ C4 E7 t6 q  {/ [Max.x2 <- round(max(x2),2)0 N) k7 u' A7 g, g/ R8 ^
    Median.x2 <- round(median(x2),2)- y: R. `2 x: `
    Sd.x2 <- round(sd(x2),2)# K6 [- Z1 F/ {
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    / }4 W; `" d) K4 Y3 oMean.x1 <- round(mean(x1),2)
    " U; P8 D/ ~( [1 S& U/ ^Min.x1 <- round(min(x1),2)
    ' L6 n7 u) C# q  S0 k/ rMax.x1 <- round(max(x1),2). ?: A% G* v, X) q7 U/ F
    Median.x1 <- round(median(x1),2)
    : M9 W+ y' H* D7 c2 aSd.x1 <- round(sd(x1),2)
    3 F8 E: w( H  I: x+ w+ e8 Rcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    : h2 E1 P  {5 C1 t( nx3 <- data4$friends
    ' i/ u# ^( z0 x% f. u$ P& G3 yMean.x3 <- round(mean(x3),2)
    " z9 D$ E# ~+ x1 _- q" @! u# m1 tMin.x3 <- round(min(x3),2)
    $ S+ l& v8 _2 o9 GMax.x3 <- round(max(x3),2)
    ( N" \' W- G0 w- w! E7 e$ kMedian.x3 <- round(median(x3),2)
    7 f0 y/ N* _  q( t; ]Sd.x3 <- round(sd(x3),2)
    " r# h6 S; G3 k6 G% q( \cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果2 N" `. Q6 v8 }/ Z
    y <- data4$salary5 V; x5 u7 B: v" f
    Mean.y <- round(mean(y),2)( N  g) ?" U: R+ R2 T, O
    Min.y <- round(min(y),2)
    8 K$ V8 K/ v$ u4 p! D$ v' uMax.y <- round(max(y),2)
    1 @1 a& \  b4 A) S0 V- z/ WMedian.y <- round(median(y),2)
    & |! \8 ~+ p3 l& mSd.y <- round(sd(y),2)% i6 H* Z5 m+ |9 @5 X! M* X, t
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果5 b! _# w2 F0 \; o# g
    5 K+ C8 }2 J; I! \
    #64 `0 M8 m9 e. X  a- U
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。) m4 \3 @  q8 F- a
    round(cor(y,x1),2) #y和x1年龄
    ) `$ ]8 ~( @0 i- ~$ x# tround(cor(y,x2),2) #y和x2居住时间8 w9 T# a% T5 Y3 u: y9 g
    round(cor(y,x3),2) #y和x3朋友数量
    $ t. z+ q1 h% @9 r3 j, L
    " w6 [. n9 H6 u; L#7, f/ W6 e9 u' g1 k9 e6 _
    #分别绘制数据集中因变量与各个自变量的散点图
    * l! i3 B" B1 m' J4 L# E% ~% Apar(mfrow=c(1,3)) #布局,一行画3个图8 P! t$ M  H6 z
    plot(x1,y,xlab="年龄x1",ylab="工资y")
      ~7 t0 t2 l. t; ]plot(x2,y,xlab="居住时间x2",ylab="工资y")
    ! s; C  z) _. Xplot(x3,y,xlab="朋友数量x3",ylab="工资y")/ w7 i6 k. W% @2 s, p4 U

    0 r" w- ]/ _) {+ e" {0 O3 b) H#8
    $ H" w: }6 N) x8 L3 p4 J#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    * i8 H( }  R/ nlm.xy <- lm(y~x1+x2+x3)0 ^. V& R  ~: U  m% q
    lm.xy% }8 ~! ?& [' Y5 G3 B$ ]# q
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的9 Q0 E9 E* `' Z! x2 ?
    / d9 n9 u9 S1 U
    #9, U7 U( t3 g5 [: ]8 u
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    ' y8 z. \3 Q/ Y) D3 N: Cpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列& s+ q6 q4 }/ I7 f& {
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布, g, W5 k' G  i0 K& m- w! a$ \- n: I
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。% t' R" Z$ W, B
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    ' o; r0 x/ P* b8 r6 [#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。- b+ R: p$ p$ w( _
    plot(lm)
    ' o! t( F2 X3 M0 ^$ n, Glibrary(carData)/ S$ s% f2 [1 Y) W  h6 t2 k
    library(car)! i/ C; C+ S+ W+ z
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    . _- @" `. W( Y+ L- S  Y7 r( n1 ]
    $ ?' w: v6 \) V- _#101 D* D- ?. O; o  C
    #删除异常值记录后重新利用多元线性回归模型拟合数据。2 Y# e% ]: u4 L% u* s# F
    data4 <- data4[-136,] #删除该点
    & E  g. C1 f/ Y% fx1 <- data4$x1
    ( c: g$ [% r# N* e0 F" \x2 <- data4$x2, c+ m! h0 ]1 `4 T5 A0 d9 r
    x3 <- data4$friends
    & W. q3 l0 H& ]4 W% Q: vy <- data4$salary
    / x* Q# i: o8 z3 y3 j3 Olm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型- e! p8 H  U; }7 q3 J
    lm.xy2
    " ]: d) v% u- D6 O8 G; M
    0 e  P2 ?4 {, ?3 ?1 m: `#11) F1 N+ q6 O, A1 U$ Y- A
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    & d) D/ a; Q3 g5 V/ N6 _& a- Lvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)9 J- {; m% C: s2 i0 I

    ; R3 ~9 R5 e+ K5 Z; F2 q#12
    , P* j, P; L' }0 Z#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    9 H( t, l9 E, m$ k- {0 ksummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星) M5 [0 J9 `8 e' \. x: ]4 U) T

    3 w5 X1 d- y. M4 a**********************************************************************
    5 i6 `& ]0 K; ]4 e% S
    3 K0 P& X* [+ d+ H6 ^# Q二、利用多元线性回归模型预测收入
    ( O+ G' k2 |4 x# X- z. D" t% ~3 NView(data4) #124条数据
    : D. l8 h9 a9 g# Q7 W/ |/ v& x#1
    7 L, t$ R- x3 q8 o, v#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    , I. c; L& p2 `3 Qtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    . D- A9 k, B6 _* ZtrainData <- data4[train0,] #训练数据
    7 C0 _; ]! t" utestData <- data4[-train0,] #测试数据/ n" }- F7 `% r/ i) l) G& e

    ! }1 E, I( ]4 e#2
    9 l# B6 P3 V( j( M, x2 V#针对训练集,利用多元线性回归模型拟合数据。) W2 {; }/ d( s4 O' ^; ]+ V$ J
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    5 l0 z& T7 }6 U/ M
    4 ?5 B3 L6 h6 J$ P#3
    5 g. {) v4 W7 L6 \% \5 u#对(2)中的多元线性回归模型进行诊断,处理异常值。
    2 V! j( R  `& `+ l6 i7 V' x+ U8 r1 Dsummary(lm.xy3)
    6 D2 ~, E6 \# I+ Wpar(mfrow=c(2,2))
    ; X# y2 s& u; Xplot(lm.xy3)2 U( b2 A6 g, Q! d/ K; Z' D
    outlierTest(lm.xy3)! a# G( X9 k0 b  @% f, i
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的8 {7 T; }8 t5 Q4 q( @

    , w2 ^5 T3 x# g6 j' C! R! e#4
    / D1 Z' D3 K8 x, [8 R: `#对(3)中的多元线性模型进行多重共线性检验并加以处理。% {; V1 L! U! ?: M7 T2 J
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)2 s7 |; m7 q" l! A$ d; w; I$ ~
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    4 q  T% k4 M, ~) U) O! ex2<-trainData[,"x2"]* [; x7 V8 }) q6 u# h
    x1<-trainData[,"x1"]
    0 d8 w. S* A8 y( w* C7 D& Kfriends<-trainData[,"friends"]
    0 c. Z2 B- Z# g7 z6 [1 Clm.xy3 <-lm(salary~x2+x1+friends)
    1 F) y  W. l! _7 ^5 K: Q! r& `
    #5
      ^; K4 h& x! K6 J: ~+ x- q( r6 ?#针对(4)中的模型,分别利用AIC和BIC选择最优模型。" B" z, |6 P9 d8 O& C5 V
    #AIC检验,赤池信息准则,选择最小的9 J8 P" `6 m0 }: l7 [; L
    AIClm<-step(lm.xy3,direction="both")) T! f* p  x- W8 _" M
    #BIC检验,贝叶斯信息准则,选择最小的
    9 `  `* ?% \! l" dBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both"), K# ^3 _4 `9 F5 p

    - u; J3 x* ]4 o#6" y" l5 V/ j4 n# o+ ?0 ]
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    2 \) H( p/ [" C! h#这三个模型预测的准确性大小,并进行解释。  e0 z) Q# Z! S0 f. N+ k; A3 M5 m% b
    Allmodel<-predict(lm.xy3,testData)/ Q! n" @( D  {0 E* {. C! n5 m
    AICmodel<-predict(AIClm,testData)
    8 K7 ^6 b& p6 @" g, r# l. ^2 M" _BICmodel<-predict(BIClm,testData)
    + ?% h3 v* Q( z; p6 ^$ ~; n/ Z3 y( ]#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差* w  |( h$ K/ e9 E4 v3 I
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    / c4 n/ y# Y8 F. _- q#标准误差能够很好地反映出测量的精密度
    3 A2 ?6 V: u, G6 u& l6 ^, ~MSE <- function(x){. o5 Q$ s6 h4 D' x& F2 H# Y
      mse <- sum((testData[,"salary"]-x)^2)/50
    & S2 A5 P* g4 F# C$ ~. B; V+ h  return(mse)- C7 g. n+ ~. \7 ^
    }/ d, U5 C& m! |
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    - p4 i  s4 v4 O: j& o- B, mMSE(BICmodel)
    1 g  b$ R0 [! k$ c+ bMSE(Allmodel)
    " g, K* f$ L2 C* o0 H& o1 ~
      U8 z/ ]8 Y: Y
    # X' h& y& ?6 S  ?/ G
    " ~; u. Y; N8 m+ M
    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, 2025-5-12 01:18 , Processed in 0.433711 second(s), 55 queries .

    回顶部