QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    0 x( j+ n& m- g) U% u. `9 X#1
    / M) _; G" D0 ~  t) C8 Y( \#展示数据集的结构
    1 I+ R! Y1 h' ^* o7 @# I+ V; w; Ydata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")" D; n3 m9 K* O6 w# d
    str(data2) #显示的结果有一列是多余的,需要删除; a5 k- Q. T0 H* i% T8 }4 d) X! L
    data2 <- data2[,1:9]  h4 S1 V& y* q: L7 P4 `
    str(data2) #删完之后的显示效果是正常的没有多余列
    - j7 n9 d; I! f
    $ `; k# z7 r4 t$ b4 O( W#2
    ( E& C% W4 P  U* D#显示前10条数据记录
    # B, r2 K, M( ~data2[1:10,]
    8 _9 C( K3 k) [* N2 a
    * o6 d9 L5 e& B! ]#3
    % }; {- o( h' C: C1 G#将变量名重新命名为英文变量名0 K4 \: b9 T& S, P
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    " {) B. F  L+ R4 o2 _# pcolnames(data2) <- cnames
    1 Y# @7 e+ S$ w8 j- I& IView(data2)/ \" H+ B# n* {
    ) R# }7 N3 x- B( B$ W6 o
    #4
    7 Y! W7 i6 a7 |9 i  y#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录- N( t! n7 Y) R# t5 Z
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))' N' A: \7 I6 u% d7 G" h& v
    #View(x2) #①先算出居住时间& I8 \% M' W* F9 D4 `1 r0 b# ?: A
    data3 <- cbind(data2,x2)
      O6 u. F* v2 }, o. R! c- K) G0 X#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条* y( R9 j/ v3 ?8 o
    list <- which(x2<=0)
    ; I7 k! Y( S9 g% t1 v& l: h2 Rdata3 <- data3[-list,]
    0 S* T6 p3 D4 K. u, YView(data3) #删除异常数据后是125条数据
    0 `6 s& l, p4 u- q+ ]
    7 {! R* K: X; {7 S( H2 P# m#59 E' ~* e5 g* f/ u: s
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。: T% _% p! \% {5 p+ h7 C- h$ N# |
    library(lubridate)# B4 Z" D  R2 H7 H1 s% Q
    date<-Sys.Date() #返回系统当前的时间4 Z, C6 p) i% Y+ Q# Q
    nowyear<-year(date) #提取年份
    # V0 n6 Z9 k/ S$ N! Pnowmonth<-month(date)  #提取月份5 b- J. b. b7 p
    #View(date) #查看现在的日期# z6 u' ]) j8 @8 H, T# @. u
    #View(month(date)) #查看现在日期中的月份
    2 s$ `6 U6 G3 ~  {x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))* |9 j  A0 I2 k4 e) Q& m+ h
    for(i in c(1:nrow(data3)) ){" ]; @% i4 x% X) P
      if(nowmonth-data3[i,"birthmonth"]<0){
    6 V( Y3 R3 t; J7 M- A5 [7 q     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    7 P2 \, U- I8 w$ {  v  }else{
    6 q! Z9 b' C* b. N7 s% l     x1[i,1] <- nowyear-data3[i,"birthyear"]
      K& a- h, e4 n/ J$ j2 D, M  }8 [; {( Z- j2 m+ t: W7 s
    }/ i9 A5 G" V$ Y( o% p# f% s7 V
    #View(x1) #算出年龄x1,并加入到数据表中7 `3 ^/ s2 M$ P8 U
    data4 <- cbind(data3,x1) ; d4 t$ O/ k6 D# M
    View(data4) #加入x1年龄变量的新表展示
    / U7 M+ c1 d0 R# Sx2 <- data4$x2# [0 o; F- p2 X3 |7 {- q  \
    Mean.x2 <- round(mean(x2),2)
    . E8 C$ M) f# O$ P- D% ?Min.x2 <- round(min(x2),2)
    & R" J" N6 w, ?  G0 NMax.x2 <- round(max(x2),2)
    9 G# L. R+ _% |1 u. L8 uMedian.x2 <- round(median(x2),2)6 B- v+ G" A" [
    Sd.x2 <- round(sd(x2),2)
    # {, O+ O8 b; E: k6 S. B1 g) Fcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    # q" ^% @/ ~" m. R' uMean.x1 <- round(mean(x1),2)" ^! M& N) N8 a, m1 L6 d
    Min.x1 <- round(min(x1),2)
    / o) C4 _' t. DMax.x1 <- round(max(x1),2)( u( G/ U% n0 S) U+ z( x1 C
    Median.x1 <- round(median(x1),2)
    " J# f7 f& \1 L7 o$ O7 O$ tSd.x1 <- round(sd(x1),2)
    - c2 O& _3 A. C6 ncbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果8 A- b  m; \8 U, A4 ~& r+ ^+ p
    x3 <- data4$friends& ^. B0 j  O& ^6 H( Z! w: I' A- @
    Mean.x3 <- round(mean(x3),2)' s/ k1 ]) m( I3 V7 c* }
    Min.x3 <- round(min(x3),2)3 C% G( R% t. @- E" h7 w
    Max.x3 <- round(max(x3),2)& D, ?8 S; }: L4 e. H& c- J
    Median.x3 <- round(median(x3),2)% [; o6 G4 N% H' r. i4 B
    Sd.x3 <- round(sd(x3),2)
    * d/ S; A5 i2 H* ^! d2 D- v% vcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    3 q7 u, G6 x; @2 E3 `5 @# v$ n6 Ky <- data4$salary
    8 _4 i1 y  Q! Q6 D8 a  E$ JMean.y <- round(mean(y),2)2 L/ b4 y: _* q. ~
    Min.y <- round(min(y),2)
    " G, K9 ^  I+ d1 Z# w3 \Max.y <- round(max(y),2)
    " g* z  r+ N% y+ s# [Median.y <- round(median(y),2)  v* A7 u: A2 |/ z: B: q
    Sd.y <- round(sd(y),2)) l4 k2 m# B: d. I* \  E
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果. U1 Q7 S: @4 M$ X2 c% V2 |
    , S1 a4 c% F8 ^" r$ R& L
    #6
    - Q. Q4 \/ }: x7 h* \9 s#计算数据集中因变量和自变量的相关系数,要求保留2位小数。7 @  W5 {: C1 k* d
    round(cor(y,x1),2) #y和x1年龄5 Z4 s" |9 q% F) L
    round(cor(y,x2),2) #y和x2居住时间7 i6 u& i2 z' j5 E5 `
    round(cor(y,x3),2) #y和x3朋友数量
    # N- ~* d4 q, ]  d
    3 r6 a/ D3 C8 Z: N# j& D, ]#7
      n4 j  g9 q2 `2 X0 D# L& G#分别绘制数据集中因变量与各个自变量的散点图. Q3 z2 G3 b# a  u
    par(mfrow=c(1,3)) #布局,一行画3个图
    " L2 K  A5 O* d4 \6 gplot(x1,y,xlab="年龄x1",ylab="工资y")9 ?9 ?' k. c! p: Y) P% j, L' v( v
    plot(x2,y,xlab="居住时间x2",ylab="工资y")  ~$ @4 J1 X! ?% _( ]
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    0 U: n" F% ?* j: b. t8 d8 A8 o: K+ i7 @; Q$ H8 U! N9 m6 F) g( S& z8 B* V. }3 z
    #8
    7 C5 ?9 g* ^0 L! n' v- n#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    ' |8 C7 D* x! q+ _( qlm.xy <- lm(y~x1+x2+x3)
    2 u- c" n, @, @* @: m4 j1 ?1 llm.xy7 _2 H* y* o2 z% H" B
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    + C. ~' S" a$ d$ j) |9 S# i, u6 Q! g. Z1 e+ u
    #9
    3 b- o5 k/ E" P5 [* `#对#8中的多元线性回归模型进行诊断,确定异常值记录。. S6 v" k4 p1 {0 C
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列! `( I8 R' Z2 Q) Y' Q
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    ' I" N4 g0 ]' h#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。. D# o8 |& A0 q" X
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    8 E  G1 _- e3 ?4 l" l#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    7 S' O7 Q/ t4 q% @! Splot(lm)% R5 q7 g5 A. l
    library(carData)
    0 s* J  e& I0 ^8 X! M! Zlibrary(car)
    # G& \' m6 W: z- q' coutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    0 b! ~* E/ S! ]8 T2 h4 W7 a
    : C3 S$ d% q5 J# p, G#10
    ( {# v) t( ]- B- O% K! U#删除异常值记录后重新利用多元线性回归模型拟合数据。
    1 ]7 s5 i: s# l+ ?$ X5 r. Edata4 <- data4[-136,] #删除该点
    - u9 a! z% X' j6 P  L  Ox1 <- data4$x1: X  i0 m5 i. \, ]* N  W9 ?! I
    x2 <- data4$x2# H# M& O/ Z$ [, O
    x3 <- data4$friends/ G/ h& a8 {: `! {- e4 F
    y <- data4$salary2 v' K- v# M% ]/ g& q, y7 r
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型' z& m2 t: v+ e
    lm.xy2/ V  E$ o2 J0 t6 v5 R% H8 J. j

    6 X2 U0 u8 h* }( ?& V#11
    3 T- ~5 k5 r# B, t4 L4 g  {#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
      f; E: b! Z" d( u: x; hvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    # S+ L2 R6 n9 _
    2 y( o" y* s1 |) r#12! N  T; w: R! ~. }0 j) m
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。& v3 r0 ?+ v- E) u$ x
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    . p# J$ }+ P9 V  r( C3 L! v5 O' y  ^, z0 P3 X% V: o# _0 B
    **********************************************************************5 B5 h; x2 J" _5 N+ R
    ! M+ j: b, D1 J& S2 r2 N" Z
    二、利用多元线性回归模型预测收入
    ' f& _5 d& l- i. S" v9 M2 FView(data4) #124条数据
      P" N: F, v" }" M7 n9 N#1% b6 Y3 a& h$ P1 P) l" r
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    5 d1 W$ k# b2 }& T6 S, n6 @train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集3 j- Y! J7 A7 U1 @! B2 L+ i
    trainData <- data4[train0,] #训练数据! c. d9 s6 u/ K9 P0 J
    testData <- data4[-train0,] #测试数据
    3 u/ d' `# N8 b$ C+ `5 b
    - A6 z4 z. a8 t) I. m#26 a1 g; w6 ~# g& b+ d* d' S( O
    #针对训练集,利用多元线性回归模型拟合数据。
    4 m, v8 I$ A  ^' D) c; h5 q4 Vlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])7 W* G+ y& u" z' h
    1 @" f1 [. k) N- e. m0 q! p( ~
    #3
    6 h2 z1 F' B' ?, m+ ?- f#对(2)中的多元线性回归模型进行诊断,处理异常值。, Y2 X. e* T+ p
    summary(lm.xy3)
    - W% n! z# V1 {5 s5 |# \par(mfrow=c(2,2))) f2 \: f6 S9 }% d3 U8 V
    plot(lm.xy3)/ {9 q1 l: c3 q% C! \  l7 Q) ?. Y
    outlierTest(lm.xy3)
    - _/ E+ _, n* H  ztrainData<-trainData[-c(150,32,82),] #删除异常值,随机的" j8 f1 G0 {: G4 E4 u$ O* {; O

    - q3 o0 g9 G( B#4
    # o" R% S0 t' ]! a9 P' L! l5 ?#对(3)中的多元线性模型进行多重共线性检验并加以处理。; |0 n+ m  i3 J$ Y
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在); S- C7 U& S7 G( n, K& |& E& Y$ A
    salary<-trainData[,"salary"] #引入的数据是训练集的数据: ?  M: d% R) ~9 [, w
    x2<-trainData[,"x2"]
    " Y$ c; \% I9 m5 mx1<-trainData[,"x1"]
    " c( f2 V8 b" Y( ^% ~6 r! S) afriends<-trainData[,"friends"]
    / _$ T4 j& t' y& S8 O! Qlm.xy3 <-lm(salary~x2+x1+friends)
    - h" f$ S0 W6 l' R, {3 N3 S9 j. t6 V8 `; q. _
    #5& X* F9 ]! _, f+ w# @
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    9 p1 e4 q0 \/ G; _0 G#AIC检验,赤池信息准则,选择最小的
    ! D% k9 K& W/ V5 [; iAIClm<-step(lm.xy3,direction="both")' g# ?1 v4 v, `8 U4 L, ?' Q
    #BIC检验,贝叶斯信息准则,选择最小的( k! V0 M1 C. y1 h
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    6 V( ]! _+ [/ Y" @; M0 e, M. Q0 K6 g5 V$ i( o) n* s- _* [
    #6
    % u: A$ d+ M& s/ }#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    % I# R0 D! U  z#这三个模型预测的准确性大小,并进行解释。
    9 G* X/ m9 t, O7 M1 _1 UAllmodel<-predict(lm.xy3,testData)* `6 I( A- c& N4 ?0 Y7 B' o
    AICmodel<-predict(AIClm,testData)6 n$ y% Q- r9 r4 W' L6 D0 `% ?7 s5 X
    BICmodel<-predict(BIClm,testData)
    % \: l5 O2 ?% Y% z4 @. f5 n#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差& o" B9 y" `9 d5 A- h
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    & t5 H- D, Y  ^9 Z#标准误差能够很好地反映出测量的精密度
    " `7 C8 M. y; f) t4 nMSE <- function(x){5 \2 \8 _' E7 y$ M$ Y; N/ ^
      mse <- sum((testData[,"salary"]-x)^2)/50
    , s+ R4 g, t$ H  return(mse): c; Y: a& J4 f# p5 r
    }
      k& D9 R  B* mMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    2 x1 [# `- N0 y( c/ h$ r1 u5 R# AMSE(BICmodel)( C2 M7 q0 [, j3 a) J1 J
    MSE(Allmodel), b( k* @  Z' ^3 M
    8 o6 N) |  S6 Z1 I% Z

    0 G  a9 [; o; c) D3 ]4 W' A
    3 |4 C" x: c9 b% M; ?0 G  Y
    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-22 01:13 , Processed in 0.400072 second(s), 56 queries .

    回顶部