QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    % F( R3 W; A: n; k#1
    % f8 S9 t* [1 W( H9 f% O$ ~#展示数据集的结构
    + @- G- \& i; Q3 z+ ]" _3 Vdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")' G) i  Q) S! e( `. o- o
    str(data2) #显示的结果有一列是多余的,需要删除
    3 u2 _3 A. @" _. Ldata2 <- data2[,1:9]: T6 ~) U3 P5 }7 U
    str(data2) #删完之后的显示效果是正常的没有多余列
    4 \  }; ~2 R$ \! [2 }/ X6 l
    ! ~* w+ d$ I& x$ }" s" p#2* i+ n9 @6 @: ?
    #显示前10条数据记录
    7 f: i. s) L; ndata2[1:10,]
    7 z7 e" f2 e9 K( u0 m! z  `& b+ ~/ X: b& Q
    #36 `* r& c5 j( L2 p0 E" `: y1 o
    #将变量名重新命名为英文变量名0 n- x2 {5 V# @3 l' f& ^: x+ w
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    4 j; C% Y9 ]" Icolnames(data2) <- cnames
    # M* _4 P( E' \: |, F/ S$ tView(data2)
    / k' N: J% E8 a8 W1 H, U/ V, W' `' z  O
    #4
    - \3 [! q9 P6 i  N8 _#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录; U9 z( k* l7 m1 v2 q% [# [% j# |
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    $ J2 q" y! I: G4 T# n& P& l8 Y! R3 A/ n#View(x2) #①先算出居住时间7 s, S& q8 d5 D& \/ n5 ]
    data3 <- cbind(data2,x2)5 v# S9 ?2 o; V! a1 [! @' w
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    , l9 s. e# A" Alist <- which(x2<=0)% v. F/ ?% \. O/ F7 a, ?3 l
    data3 <- data3[-list,]
    % O9 c3 g$ i+ }( r7 ]7 M+ GView(data3) #删除异常数据后是125条数据6 J4 T0 V, f) Z) L  _5 e
    , Q0 Q2 C. ~3 t; r7 N, ]( B
    #5! G' S& U2 f  k# v* f
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    + ^* ?2 F1 O, M+ zlibrary(lubridate)' `' @: H$ R2 w8 n, F" B
    date<-Sys.Date() #返回系统当前的时间  _4 z8 K8 t  ^  |
    nowyear<-year(date) #提取年份2 Q6 X1 L$ U  ?; d
    nowmonth<-month(date)  #提取月份
    ( |8 n  ?( J8 Q7 B2 ?% F#View(date) #查看现在的日期
    ' w0 M* G# ?* E7 u  ~0 V#View(month(date)) #查看现在日期中的月份
    ; R3 d6 S8 _- o+ W3 `x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    9 C0 J" s' \) Q7 S8 w! {- qfor(i in c(1:nrow(data3)) ){+ m  e" K4 z% B. ]# i
      if(nowmonth-data3[i,"birthmonth"]<0){
    8 Z! Z% [) S3 b5 c1 ^     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    2 _( @0 q6 T% O9 ~0 z+ c: R  }else{. }5 ^7 @4 H- Q; Q  @" E( ?
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    1 A  a& X/ s6 A  ?4 J: U$ u  }
    5 V! D5 J) B$ L8 I9 p% z}
    6 c, a7 G( Q- {, \$ {4 z( {#View(x1) #算出年龄x1,并加入到数据表中/ c7 R5 p; {! i+ |% U7 _& H
    data4 <- cbind(data3,x1)
    9 ]2 F5 }# o  }2 U; R6 I; T! }View(data4) #加入x1年龄变量的新表展示6 Y+ ?1 ?; S9 Z5 X0 k9 ?/ ]
    x2 <- data4$x2
    " Z4 K4 G4 h1 T( M$ y. J+ t& DMean.x2 <- round(mean(x2),2)3 o. O/ `) D( q; g; d1 h" d
    Min.x2 <- round(min(x2),2)% b+ d0 \, M; `  z' k% Y% N
    Max.x2 <- round(max(x2),2)( ^! d6 b  [, j, c
    Median.x2 <- round(median(x2),2)
    * |  m* a8 ?5 |9 @Sd.x2 <- round(sd(x2),2)  s, f/ N) P  a  I4 [7 b
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    - @- s. C4 Y" r6 T" XMean.x1 <- round(mean(x1),2)
    " |( T7 Q# k! Z+ ~8 iMin.x1 <- round(min(x1),2)
    ) d  f8 b& u; j: d, J! T3 m5 B4 AMax.x1 <- round(max(x1),2); i7 l: s' ~- o
    Median.x1 <- round(median(x1),2)
    7 Y6 X' p' t8 sSd.x1 <- round(sd(x1),2)
    1 Z2 t' E+ Y, S% X' W$ `4 F3 Ocbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果  u6 y6 \: [. A  Z' L
    x3 <- data4$friends
    $ h( e; R' p8 t% j9 _$ V2 KMean.x3 <- round(mean(x3),2)# F7 l0 l1 C) t: m- m% ~, E
    Min.x3 <- round(min(x3),2)
    ( M, Y; u% J0 y$ p6 uMax.x3 <- round(max(x3),2), t, \" R' i& _# g7 J) U
    Median.x3 <- round(median(x3),2)
    3 f) L* Z& o4 w4 V) sSd.x3 <- round(sd(x3),2)
    % w. L$ Z& Q$ @/ T3 o6 x7 Rcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    / Z& E( v! l' j! `$ W$ T/ my <- data4$salary" A: F1 L6 t1 B" M
    Mean.y <- round(mean(y),2)
    2 L, s4 D- u  @. c# u1 a& m% PMin.y <- round(min(y),2)* t. W. P: c. ^6 F1 }% F- n% ?
    Max.y <- round(max(y),2)9 x1 d2 W: E6 H
    Median.y <- round(median(y),2)$ u% |9 q9 B9 E. z* O5 C! H
    Sd.y <- round(sd(y),2)
    % S9 N. n5 \$ [# o( w- Hcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    ' ~% N' G" Q# ^6 ]( G3 d1 c
    2 N0 T( M7 r" P4 }8 ~% z2 n8 j#6
    ) I# T# e: w- E8 L. x#计算数据集中因变量和自变量的相关系数,要求保留2位小数。6 x: t; q) Q6 c
    round(cor(y,x1),2) #y和x1年龄
    : A( w& e6 s9 o# V) ?/ L% y! Yround(cor(y,x2),2) #y和x2居住时间
    , K* Z; `, Q5 U+ ?% T- B) n: oround(cor(y,x3),2) #y和x3朋友数量7 v. X* t" D* u: o- T
    , I1 ~5 s& m  T) r' E+ F8 d% P! P
    #7
    " e: S. [+ |. U- ^. x#分别绘制数据集中因变量与各个自变量的散点图$ b9 I7 i  [2 M0 ?8 Z/ n
    par(mfrow=c(1,3)) #布局,一行画3个图0 C* E- W4 K1 m/ b: g2 l  d
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    1 Q' w. }4 Q5 y2 Mplot(x2,y,xlab="居住时间x2",ylab="工资y")
    1 a, w6 h4 d6 c( B: y9 h. Rplot(x3,y,xlab="朋友数量x3",ylab="工资y")
    3 ]+ r" i9 h7 ]# Z% r4 m! u0 R) ]2 Z$ o6 g0 D* v" j) r) B
    #80 g- e( s" L$ {
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    0 [* ?. i* q5 I- Klm.xy <- lm(y~x1+x2+x3)6 E7 k0 m3 |* g
    lm.xy( z$ f* `# r; x3 S/ z. J. h$ M
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的( l) Y; e1 ~' c/ m

    # @, m# k& K) C#9+ d4 G& ]3 ~% C+ @8 |9 W6 y
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。* U; J5 c: T+ J$ D. O- J; {+ f
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列# m) e2 ]/ M( X" O3 W
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    , x% m$ y) ]# N. z9 p1 e, `. _#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    2 a: J  s+ I! a#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    6 U0 d' f% K- Y#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。: @& m( H5 X5 r# O6 I, _& \
    plot(lm)
    + S, \0 u2 n4 e3 ~6 B# p2 x7 glibrary(carData)6 V" V. T- L& G, @4 @% z& R. l$ r
    library(car)
    , t7 E' m' P- k+ U, r9 d5 CoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点$ @0 o8 w' w: i, \

    ' S  @8 f' J2 M4 e  T#10$ f( [* f8 I7 Y/ R8 s
    #删除异常值记录后重新利用多元线性回归模型拟合数据。- V* G2 \( k/ H  A$ V/ h
    data4 <- data4[-136,] #删除该点
    - f7 n+ b( o1 H" Ox1 <- data4$x1' H4 K* i( l! C2 k. {( U, u" Z: A5 r) N
    x2 <- data4$x26 Y1 T0 ^# V/ g1 }
    x3 <- data4$friends
    8 L- l9 P* i% Zy <- data4$salary
    5 f4 ~" U) ]* b. @( clm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    , R6 G0 d0 r+ Glm.xy2
    " x3 E0 T. ~# e7 u9 \6 ?  x1 Q/ F& E  A
    #11
    % P' X! `5 `7 p& g3 t, k# G3 e#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ; ~% z1 O8 i' ?" b, yvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)9 L6 g, c+ I, B, L7 i& v6 v

    - [$ l7 T' x$ g/ M: h+ m/ \#126 l' U; }1 G6 X3 z& K( x
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    1 U" n% x" [5 _, ysummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    8 s2 c& Z/ r' U
    2 e) W/ R+ q6 L; @- }0 e: l**********************************************************************5 E# E; x: Z: P) a" g
    / `6 r" c7 t4 Q  J- k3 t
    二、利用多元线性回归模型预测收入5 J" B5 q6 I* z" V% R
    View(data4) #124条数据
    9 \$ d" g# e  Y$ L6 w; ~9 J#1  k6 W. W6 I5 L6 A. H6 H
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。# o* m# _- ?' I: j6 [4 e' Z3 G
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集) v  G8 q8 Z7 c( u+ M& D* L
    trainData <- data4[train0,] #训练数据$ J, @! s, Z% X+ P
    testData <- data4[-train0,] #测试数据6 N8 ~7 h6 P0 R2 Q6 ~! n: g' z5 M6 w

    * l, v* L5 i0 M+ W#2
    8 N; g* F& P9 ~#针对训练集,利用多元线性回归模型拟合数据。
    $ j3 a5 j: r6 X2 f3 dlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])$ h! b6 I7 x2 C) s

    . l/ y6 I* f( |! G2 D#3
    9 K( L1 N: _% @8 y$ W% [8 B#对(2)中的多元线性回归模型进行诊断,处理异常值。
    ; y% j+ Y6 c2 ^1 P( Z6 O+ hsummary(lm.xy3)
    " j+ [( v0 p& o# _3 k2 Q# n% Npar(mfrow=c(2,2))( C1 p* U, K% v+ L, W. A) r
    plot(lm.xy3)
    ; ]$ _% A. u6 f# _; K* GoutlierTest(lm.xy3), C; f7 p& N6 S( w$ a3 W- [
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    & c+ B/ b& Z6 R" C2 A9 ~+ m6 ^% A
    #4+ [: c) O" D4 _! v
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。* |) Y! T" H5 ]
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)% Z( u; j. f1 K9 o, B# W3 N. ?9 l
    salary<-trainData[,"salary"] #引入的数据是训练集的数据; v4 m6 K8 z* I, u# g1 ~0 @/ L) c
    x2<-trainData[,"x2"]0 a% M( Y( K- z; }- U+ Y; |' J
    x1<-trainData[,"x1"]
    ( l+ z9 h) F; P; Z8 l+ G2 ^friends<-trainData[,"friends"]& A7 X! z4 f; x' n
    lm.xy3 <-lm(salary~x2+x1+friends)0 f: h9 |! f# u; O# n3 o
    3 ]  p) e2 a, V! b2 D! G/ `
    #5
    8 J3 i0 [: \6 X- b' U- F: L+ c  Y#针对(4)中的模型,分别利用AIC和BIC选择最优模型。. L+ \% X& p4 z9 z2 ~
    #AIC检验,赤池信息准则,选择最小的
    + b, H! l4 `. ?4 HAIClm<-step(lm.xy3,direction="both")
    - ~5 X' X6 Q" m, H8 W! X; U#BIC检验,贝叶斯信息准则,选择最小的/ C! f9 u; M# }
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")0 ^6 Q% e* ]& U  U( k4 j' _; H
    , T- x* e5 E9 L+ T% D6 y2 ]
    #6
    8 ^+ V( u1 _2 F#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型, A3 w3 u! A# h& S% k$ D
    #这三个模型预测的准确性大小,并进行解释。
    0 x) U* e( U) c1 t% S; p2 m! kAllmodel<-predict(lm.xy3,testData)8 r9 y% ^; q9 i2 Y" v/ l( N$ Y4 j
    AICmodel<-predict(AIClm,testData)
    ; v) z( r3 ]/ Y0 u4 P) F# y! [& kBICmodel<-predict(BIClm,testData)- ]" |) \* Y* V% M% |; x
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差( F$ y' r# e- \' }  k1 @/ z$ ?
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    * L1 k+ I4 \) w# B: W3 H#标准误差能够很好地反映出测量的精密度8 V8 O8 R0 V4 V9 p/ G
    MSE <- function(x){  q' h' D1 J5 I) e; G& R3 f6 K/ b
      mse <- sum((testData[,"salary"]-x)^2)/503 H8 L+ k' ^& \4 {3 C4 R# A( [
      return(mse)
    . M1 z; i0 z/ k. K}
    , a- ]  z! Y9 d7 {  v/ I" H. ~MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    8 P  m9 I7 o" g) Q5 Y: m  D8 vMSE(BICmodel)& v, e8 X5 d6 R- E2 I
    MSE(Allmodel)
    $ _5 U1 y& X7 \$ @/ i% H; m, _: F4 c& r1 F
    / u7 [. O3 [7 P% x2 ?, @1 R

    - E" f3 j: H, Y( T& }
    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-21 18:27 , Processed in 0.694670 second(s), 55 queries .

    回顶部