QQ登录

只需要一步,快速开始

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

    一、背景, C% c. F: v& t! F; U5 i- E
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    2 ^9 ]4 v3 p$ C% o7 h& m. n#1+ H2 I" s% Y: @: l/ l! n
    #展示数据集的结构
    5 Q! }% `; C1 [; p3 j; ydata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")  R$ n1 Z! t  ^$ U  d0 ^% r: B
    str(data2) #显示的结果有一列是多余的,需要删除% |* B* S& J" A: h+ i0 P
    data2 <- data2[,1:9]) K% {( _% T: h; |# t+ {$ A
    str(data2) #删完之后的显示效果是正常的没有多余列
    . f- {  ]# ^- j
    0 f. a0 ~  e9 v#2% M. d; z) Y, q; y
    #显示前10条数据记录
    . O0 y) C3 `# v+ Z  d2 `data2[1:10,]
    7 B8 B2 r3 a9 S  b1 t0 T! D
    % l7 c* Y% I- g6 }9 g9 K4 U#3
    & a: b& X7 J) l) b! a: v: ?7 E- z#将变量名重新命名为英文变量名" ~, ~& ]; ?1 u2 v( A
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")+ r8 Z  |! ]3 ~
    colnames(data2) <- cnames2 s3 R* V4 e4 [! e! O
    View(data2)
    ' f( J, J- a8 p" j9 A: s& e
    $ J. I  S' k4 U9 f0 N#4
    ! x+ x) w8 Q  ]* s- A3 v#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    : X2 N* u$ M0 ]& I9 fx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))/ v  F& ~+ ^6 r8 ~- N7 r& c
    #View(x2) #①先算出居住时间
      I$ B7 g1 u2 D2 S0 ddata3 <- cbind(data2,x2)
    7 ?, B6 ?- f! J  G#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条( V6 H# Y! T" [( y6 @' f! o
    list <- which(x2<=0)' E0 S  Z4 E; [# F
    data3 <- data3[-list,]
    ; S! X! D: \! hView(data3) #删除异常数据后是125条数据
    3 |# P& C: L2 w) O: z# U0 F% c1 D& Z# e2 h, r; a
    #5' T4 l3 f% c7 T* V
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。, D6 R- s- r. x8 q/ e+ L: l$ ]5 e3 [/ P
    library(lubridate)6 s, N$ Z& N8 _+ U  O) e
    date<-Sys.Date() #返回系统当前的时间
    & K/ _! i" O- M% z5 D3 x: _nowyear<-year(date) #提取年份( }' E/ f2 _6 G
    nowmonth<-month(date)  #提取月份& G, g$ I4 j9 F( d
    #View(date) #查看现在的日期
    3 P6 O" l: U( ~3 j1 T9 M#View(month(date)) #查看现在日期中的月份
    3 Z, D* M$ {) {  {  }( Tx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))3 }8 W* K: C% G6 Z/ i
    for(i in c(1:nrow(data3)) ){, S8 b9 Q" C/ a3 Q
      if(nowmonth-data3[i,"birthmonth"]<0){3 j( U/ i6 D0 W& K
         x1[i,1] <- nowyear-data3[i,"birthyear"]-17 s: @! K9 g" N3 v
      }else{
    0 b( s6 i' ]; I  i: ~     x1[i,1] <- nowyear-data3[i,"birthyear"]( E/ ]( d) t8 i, t  u1 g) Y# T
      }# z4 ?8 R( u, N/ ]$ m. \
    }
    ( v2 ~& N" x  C  ?/ o& e#View(x1) #算出年龄x1,并加入到数据表中
    7 u3 b, t& _. @' ~( pdata4 <- cbind(data3,x1)
    " j% a4 E3 t8 lView(data4) #加入x1年龄变量的新表展示* M: I& I5 K4 `' B7 B0 c: h
    x2 <- data4$x2
    ) I! ^7 b4 k. g  I& w  {: cMean.x2 <- round(mean(x2),2)
    $ M. [" g9 d4 S) O8 U8 cMin.x2 <- round(min(x2),2)
    / I8 n* @' b' Q$ wMax.x2 <- round(max(x2),2)4 h/ U& J  t/ v) M
    Median.x2 <- round(median(x2),2)( N1 w: Z; D* L! M" S: K
    Sd.x2 <- round(sd(x2),2)
    ! C, l6 o7 a% bcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    ! p8 b, Y3 r5 j4 a' @& OMean.x1 <- round(mean(x1),2)
    0 F# q9 N$ a/ z9 ~Min.x1 <- round(min(x1),2)
    " l9 x+ Z4 K9 w  SMax.x1 <- round(max(x1),2)
    , I# [) |1 M7 ]) ~" ^+ _. b( lMedian.x1 <- round(median(x1),2)6 y! ^' O2 z3 @8 ~( R4 p
    Sd.x1 <- round(sd(x1),2)
    9 ~1 w' [, ]% v2 pcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    ( N4 x7 s0 C& J, n3 Z  Rx3 <- data4$friends: Q% X7 U. A- N$ ]' ?4 j- y4 x
    Mean.x3 <- round(mean(x3),2)
    1 R3 P/ |4 W- n# p( L( mMin.x3 <- round(min(x3),2)
    3 f& E, D0 U" T7 O1 q( n. \Max.x3 <- round(max(x3),2)
    2 Z$ g9 C( }' {9 ^/ ZMedian.x3 <- round(median(x3),2)+ k$ ?& N: ]$ i, G( J: F: q
    Sd.x3 <- round(sd(x3),2)/ _. ^# z3 P+ \( N* l+ c8 X+ a
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果7 ]" k9 N- _* {! n# r
    y <- data4$salary
    : h' g: C  f* \Mean.y <- round(mean(y),2)" Q1 |: t- {  ]8 H- i9 P
    Min.y <- round(min(y),2)/ F, _3 _" Q* k7 F0 X; p& u) ?
    Max.y <- round(max(y),2)
    4 f$ l0 K$ h3 w' g' [/ |& mMedian.y <- round(median(y),2)
    4 L" H5 }9 T- [7 Q4 |: A& ISd.y <- round(sd(y),2)
    - n5 p3 T: p0 x  Bcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    4 o) o! d" D( \% V( ?( S5 E, P8 C4 O; A- _9 v9 v8 U: t
    #6( A5 f" c% n" [# k" W
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    8 ~4 {  g& z+ E8 J2 t9 |0 ~round(cor(y,x1),2) #y和x1年龄4 h4 b) @( n8 W; b
    round(cor(y,x2),2) #y和x2居住时间) r4 R3 u0 |* [8 N8 G+ u, u( d' r
    round(cor(y,x3),2) #y和x3朋友数量
    # u7 x  _" Z6 c
    % |; r9 ~# d9 O' I0 t8 I8 A#7  `/ Z# w: \& F" [9 T0 M) O
    #分别绘制数据集中因变量与各个自变量的散点图
      Y7 G9 M9 {: y; Npar(mfrow=c(1,3)) #布局,一行画3个图! {7 u* b+ ?, t
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    ) P5 g: @$ w! m! _0 Qplot(x2,y,xlab="居住时间x2",ylab="工资y")
    : _. ^4 E' J! C( ~3 H- ~: Rplot(x3,y,xlab="朋友数量x3",ylab="工资y"); D& F/ ~) t: y% a  u# c( z

    ; _; p" F" \1 B) Y& C, r6 `#8
    ; e) }# p! F1 A* ~5 n, K+ X' K2 o#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。4 c% p5 B) h! u5 R2 I' i# L
    lm.xy <- lm(y~x1+x2+x3)- V* x5 ?0 ?6 H, h5 g& J/ g# J
    lm.xy# F; v# W, O1 ]- O3 L
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的" O! B) E0 {- X' s2 Q4 @

    , ^* S- [2 z& s) p# ~#9/ l, Z* ~! E) g& j" }  u
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    + R& n5 H% F7 s# d- b# r. h# }par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列$ f4 F7 y4 Q" s3 [' m# C
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布1 f5 \/ o* N, }; J- g/ m
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。( ^- ?/ Z- P5 j
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    / w' M5 y3 ]6 ^#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    8 Z/ a. I7 l! h5 m& fplot(lm)
    & K" u; E. w" s% {7 wlibrary(carData)
    8 x' p5 a3 J3 h( N7 Glibrary(car)
    & B  }# \- j% j7 |( ?- P; w& d: ~outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    ( \/ u  a' N- L2 Y1 E" z$ r7 Y, V0 ?5 p
    #10
    & ^$ H4 ^4 |8 s* M8 }- c% Y/ P#删除异常值记录后重新利用多元线性回归模型拟合数据。' S  [2 y1 |, r- u# u
    data4 <- data4[-136,] #删除该点2 C$ ]% {# ]1 `( o
    x1 <- data4$x1; l. v, f- E/ y5 Q  n
    x2 <- data4$x2# H' q! P2 T8 r! ~+ \; r. B
    x3 <- data4$friends
    " k1 N9 p2 Y% r. G  w% F' ty <- data4$salary
    4 C: O; r) d% j  L& O9 m5 Mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型% P- H5 a9 W1 Q6 v
    lm.xy2
    ) }: b/ w/ l$ N. ]9 o$ i( ~* C0 M$ `4 p
    #11
    8 @3 G; l/ e: Y4 m" y3 z  ^#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    8 |/ o; N0 d0 B; t4 A# nvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)3 g2 C$ X/ M% F; l, T2 i5 a# @* z
    ( x- c3 Y6 _; l2 C
    #12& B; _( R( s8 t& J: r( _
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    3 X7 U+ C6 i5 P) Qsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星! C4 L8 z& _' C- b2 Q8 X

      o! ^9 z+ B5 ^0 w6 `% I**********************************************************************
    . x0 x. f2 i+ z. b: w/ r+ h% J1 Y3 @+ U: |
    二、利用多元线性回归模型预测收入% m! k$ h1 ^: B
    View(data4) #124条数据  I, u0 l/ y: S6 W- |5 u% t! M, e, V
    #1. M9 N2 N0 d6 i( Y& r$ H
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。5 k' M& S; \% V4 E
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    $ x( _: ~" Z6 \; x" b* S( UtrainData <- data4[train0,] #训练数据- k+ e( D, `) A3 w
    testData <- data4[-train0,] #测试数据! I3 N, E7 u" ^' f1 I( V5 q

    ) I+ G% T! G( K: n3 _2 o#23 k2 d* j1 g) R. }  g4 l
    #针对训练集,利用多元线性回归模型拟合数据。
    ! @' Z( \' z+ [2 r% J; u4 vlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    / Y( _( d( ^9 {
    3 S' h5 T1 H$ ]; E#35 L! \  U& [5 a5 l* Y' O& L; ]" f7 M
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    4 D! Z  z8 v* p5 Z/ Q! M6 v6 Dsummary(lm.xy3)1 k' g+ h; U7 w. a* d# J# i
    par(mfrow=c(2,2))5 @0 M" E9 t( \2 ^6 q
    plot(lm.xy3)
    * @9 C! o, w7 f. D5 z4 ?! UoutlierTest(lm.xy3)6 \! I. I3 A. U& T) z! J9 y9 p  f% l" \: c4 x
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的2 y$ @- Q7 r: T( s, @: V# x

    " w2 E3 g3 u# I6 h7 r( z#4. m& [: M: G( e1 V0 y8 x3 _% }
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
      d$ o" a. j+ }( ivif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)1 c: V* v, |% F) @
    salary<-trainData[,"salary"] #引入的数据是训练集的数据0 A( ^2 ^4 X: l6 F& ]
    x2<-trainData[,"x2"]
    ( }% x0 i9 A8 |2 @6 nx1<-trainData[,"x1"]
    / x* c$ {5 k7 W+ x/ k5 kfriends<-trainData[,"friends"]
    % X! u0 h( t$ l0 n) t# klm.xy3 <-lm(salary~x2+x1+friends)
    ) d+ r  h) a" P; {. @2 `3 o# a! m  P1 Q  k% [" w
    #5
    , S$ W, e, w/ R8 s' M3 A: g% ^#针对(4)中的模型,分别利用AIC和BIC选择最优模型。& Y5 m; Q* Z; X& s# }, @! U/ ^6 g
    #AIC检验,赤池信息准则,选择最小的% j- p, W' Y- R! T
    AIClm<-step(lm.xy3,direction="both")
    ( v8 G4 K, H. x* e7 ?. G#BIC检验,贝叶斯信息准则,选择最小的, ?) g5 q7 {5 B; f6 D# ~6 |3 ]
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    1 l9 t! ^4 A1 }; X0 W$ z5 ?1 G7 H1 J) T+ R  N& f5 V& K
    #6; g! x) q4 l* t! Z3 f: }
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型' o7 Z- t, t5 A  d/ S
    #这三个模型预测的准确性大小,并进行解释。; e/ T) ^* A0 f' {, z
    Allmodel<-predict(lm.xy3,testData)
    " k( q8 ~  ?" B: \AICmodel<-predict(AIClm,testData)
    / V  L" s1 h" jBICmodel<-predict(BIClm,testData)
    " t7 o3 V! d' o4 I. X/ ^! D#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差& N0 f: L8 x5 n
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根( ?# m( y" A! k$ p* F$ X
    #标准误差能够很好地反映出测量的精密度
    5 a) s7 |6 U- ~; R. [& o) |$ x( @  NMSE <- function(x){
    ' N0 n& {. `6 j" S/ ~+ Q  mse <- sum((testData[,"salary"]-x)^2)/500 \! R3 l# {+ W0 K" {; W8 Z
      return(mse)
    ( {, ^- Y! [- Q. g5 E6 x}
    8 t/ Q- ^" \6 ?$ l' Y1 v, ^* @MSE(AICmodel) #AIC/BIC/ALL是误差最小的* ]$ o* ]6 Z  [$ l" {# p
    MSE(BICmodel)
    & o: y# N- t2 M1 C: q3 RMSE(Allmodel)
    2 j; J9 z8 I0 s" B& v; a, `5 a3 s9 t- Y% o

    9 @$ O% I/ s3 ~( ]$ |5 K. P! N
    * P$ ]( Z5 i! N' }
    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-4-11 08:29 , Processed in 0.376817 second(s), 55 queries .

    回顶部