QQ登录

只需要一步,快速开始

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

    一、背景
    2 O7 H( Z6 Q7 x- n+ a; H数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素  I# p& ]( q  v! Y8 ?
    #1
    & M6 h+ T" ?5 p6 P1 w#展示数据集的结构
    3 J2 |! ?. T& A  A" u8 x5 Udata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    2 g) F$ h" Q5 G1 J. Z6 U! Kstr(data2) #显示的结果有一列是多余的,需要删除/ ?  l$ A2 r- O3 a' _* b5 k
    data2 <- data2[,1:9]
      O# E4 d6 M  z  t5 rstr(data2) #删完之后的显示效果是正常的没有多余列' h/ o& V, o" U  x$ r
    0 d9 F+ M1 T. c* G
    #2
    4 X2 s1 L" q1 [( [- K2 k# [#显示前10条数据记录
    ! W+ y) V3 ~1 `5 |/ w1 Adata2[1:10,]
    # o6 S3 o& r; K, V2 U  }$ B  E3 W, ?" P. m1 R# ~  I
    #3* ^8 _3 s$ O' h$ w
    #将变量名重新命名为英文变量名
    ) }! ?" [8 G7 B$ Y2 R0 M: Bcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")' ?2 v; R8 g: S2 F0 y
    colnames(data2) <- cnames7 S. _! P6 |+ ]  U  D, J: v4 H
    View(data2)
    + F; S& ]0 p! Z5 D9 k
    0 t% n1 Y5 F& v1 f: S4 ^5 x5 O# P#4. G7 B; K* r2 J! e
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录( q: S+ B2 e5 [+ j' I4 A
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))* p- Y4 E  p, `
    #View(x2) #①先算出居住时间
    & t& O2 w3 o& i& |9 R' v8 Ndata3 <- cbind(data2,x2)+ K/ j" |8 t/ T, d
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条$ O: q5 x/ X6 D, N( v$ ~. E
    list <- which(x2<=0)3 P7 E% v$ @9 d2 ~& x
    data3 <- data3[-list,]) x% G9 J# Q$ j5 g
    View(data3) #删除异常数据后是125条数据
      w: z3 h% h) ?0 V& m9 Y) R* O) M. r* e4 `, G* N  V1 P. S- y, m
    #52 f$ u3 i& c* z+ y# K6 e& I: Y
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    6 J+ _  ^2 ]" A! }' D. Mlibrary(lubridate)
    0 I- J7 i8 d+ k' \: p) E" r( _( Hdate<-Sys.Date() #返回系统当前的时间
    ; W, i4 e# A9 |nowyear<-year(date) #提取年份- F+ ]7 G- k7 }! |) i) |) d
    nowmonth<-month(date)  #提取月份& S- A7 D1 o1 T* F/ }0 [
    #View(date) #查看现在的日期) q8 U8 f/ m) ~3 D
    #View(month(date)) #查看现在日期中的月份
    6 S& G' x" e  zx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    - Y+ f% X5 o( Qfor(i in c(1:nrow(data3)) ){# J, E1 \: }, _9 ~/ j* @
      if(nowmonth-data3[i,"birthmonth"]<0){
    1 R  B6 g( ?4 `: p( y4 `     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    * K- G. M# `5 t6 d/ V  }else{$ o: Y. a! [5 s
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    + W3 J, v' q& m# ^  }- W0 R) V2 n$ H# d4 S
    }/ i4 g9 u, _. @! ?! l9 h( t
    #View(x1) #算出年龄x1,并加入到数据表中
    4 i# q; E  ~& C) ndata4 <- cbind(data3,x1) ! Y: V/ V. H$ c4 Z
    View(data4) #加入x1年龄变量的新表展示
    : a& V: ]$ _. ]0 I# `/ h' cx2 <- data4$x2
    , \5 U1 F1 l9 ~8 U6 SMean.x2 <- round(mean(x2),2)
    ! x$ ]7 H! ~! U1 @Min.x2 <- round(min(x2),2)* t- g5 F& X( M3 W! U& @; A
    Max.x2 <- round(max(x2),2)
    " H1 l$ T, T2 h- n: Z& CMedian.x2 <- round(median(x2),2)
    0 z% f7 ~2 [  LSd.x2 <- round(sd(x2),2)  F1 |7 ?0 o6 X2 V
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果" W% c5 r8 d- r7 X
    Mean.x1 <- round(mean(x1),2)/ E; d' S& i% j5 q+ x! Z
    Min.x1 <- round(min(x1),2)
    ) R  P5 h! W8 }) U3 C9 y& ZMax.x1 <- round(max(x1),2)
    4 x( {) D" m8 C! x- D: p6 fMedian.x1 <- round(median(x1),2)* H2 @9 S0 W$ d$ M/ _& L; W
    Sd.x1 <- round(sd(x1),2)
    " w% J$ ?9 o/ V( I9 I! y- `! u6 Z: W. @cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果1 [. q- V* C( H2 V5 a& t4 k
    x3 <- data4$friends
    2 s: y' n1 M& ^9 @& [Mean.x3 <- round(mean(x3),2)
    * J! S; E- s  F0 D; \7 L2 K7 L' FMin.x3 <- round(min(x3),2)
    - p1 m" y0 v& V& ^: h! s9 \Max.x3 <- round(max(x3),2)
    2 o) G* E& z/ d& S8 lMedian.x3 <- round(median(x3),2)) G* Z  F* }9 P* W
    Sd.x3 <- round(sd(x3),2)# j" s  v8 @- `7 {! M9 w
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果: J9 G8 B6 h+ @7 F6 `1 e, H
    y <- data4$salary# M; Q# E: N" G
    Mean.y <- round(mean(y),2)! U3 N+ N. C. L, M' J$ t8 ?% x8 S
    Min.y <- round(min(y),2)
    + j' X& k' `4 U+ t8 a! [( aMax.y <- round(max(y),2)3 D, X+ j! E6 \9 g$ c
    Median.y <- round(median(y),2)& o- ~2 I/ M6 K: q4 v, B
    Sd.y <- round(sd(y),2)
    ) R4 B+ v6 `( b# @cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    ( |: F! ?; }; n/ o# \8 |% h5 f1 M% R# a( E7 s* K3 {
    #6
    ( E1 t* [9 V  B7 T* _#计算数据集中因变量和自变量的相关系数,要求保留2位小数。, M9 ~* R3 m, U
    round(cor(y,x1),2) #y和x1年龄
    ; ?4 h0 `4 h* r4 G& U& q/ hround(cor(y,x2),2) #y和x2居住时间
    ! Q5 G! d3 i% uround(cor(y,x3),2) #y和x3朋友数量
    - K# l  W8 v5 B0 |/ c2 N& p; w/ M  l  K6 J
    #74 u* q5 Z8 R0 o2 F
    #分别绘制数据集中因变量与各个自变量的散点图- B* A7 \! o4 J, N
    par(mfrow=c(1,3)) #布局,一行画3个图% [. l( T- T# a7 k4 r4 I0 j9 `
    plot(x1,y,xlab="年龄x1",ylab="工资y")! X, B$ |( j, `" c3 Z/ X5 I: m! j* l
    plot(x2,y,xlab="居住时间x2",ylab="工资y")& ^: B/ g) ]' D" d6 Z
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")% W" Y6 C2 A1 `8 B

    ) v$ t# |& R4 K4 h: J1 p# K#89 c( v, W! p; `+ u( J
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。% J  _7 p/ N8 T: o" w& v/ x
    lm.xy <- lm(y~x1+x2+x3)
    3 k5 i  x1 I) f6 G9 }0 {0 Flm.xy1 v- ~2 l0 |( B, h' y2 z
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的, l/ K) S' I. _; K5 u- e% @
    3 r) Z1 E% G2 u" ]* `3 s' J
    #9+ j9 M/ C& K+ v. e& U# j
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    , P2 h" W+ v2 |! Q+ E9 tpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列; Y- d7 k- n( i  |6 d2 x
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    " U$ A  J9 ?0 u  \#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    ( q; _& B6 Y# q$ S6 v( w) }#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    4 e8 X; F2 K# J) U#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。* m. ~$ C' j! K
    plot(lm)
    ! U2 Y$ s8 j* V; ?library(carData)
    + c. s3 `( M% m# j3 glibrary(car)9 X% Z) O, \& `
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点9 _/ \2 [4 G9 n. W7 u

    1 L* q% e: N/ H" m/ p  D' v" b- f#10( t! p+ N' }, J4 }4 `6 ^9 S
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    * C) f3 b1 ~! j, N' L, `data4 <- data4[-136,] #删除该点
    ! |" ]! ]9 I# p9 nx1 <- data4$x1- e/ h; Z/ Z) a# R" p9 U! j
    x2 <- data4$x2
    # F( ]3 _8 w' I+ b$ s" m0 u3 I+ Sx3 <- data4$friends
    * E: D' D) K% l# `y <- data4$salary2 n3 `6 N, ~( v& A$ i$ X$ q' i% l
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型) q) b( G* @" [8 G) @6 j
    lm.xy2( F1 Y5 |% u5 s' h. ?. f
    , V$ U2 Q0 a! B
    #11& q. B4 r& G$ c: y5 z+ b9 U
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    $ b8 k0 Z1 s5 J6 {vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)$ f* L8 V8 r! N
    : z8 O# X" n" a# k- ^' K- B
    #124 w1 N1 j2 J- s$ W2 B8 p
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。+ N, c7 S+ }  a$ d) D
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    3 `5 V2 J  x% R  P6 h: Q$ i
    $ z2 ~& S/ Y1 {6 O+ e& ]! W4 M9 Z**********************************************************************
    8 g* K2 [# A' U
    % j1 q* Y: F. h% j' X二、利用多元线性回归模型预测收入
    8 H$ Z  T% P; e; a$ F+ sView(data4) #124条数据3 g+ W$ P4 e0 N; G+ A
    #1
    - N' _. N" A4 |" ]/ m#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
      t' u% p6 N; K# H7 B( Utrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集+ i! _. j. F; ?- R  X" C9 K
    trainData <- data4[train0,] #训练数据& ?% T3 a: K  F1 |0 T/ a! D0 L) u2 P! [
    testData <- data4[-train0,] #测试数据
    : d4 Z9 S! j) Q5 K8 k9 M5 b
    0 S/ l! P4 q, ]4 O9 n$ v1 Y/ D#2& \8 E/ s" x2 @" g  l
    #针对训练集,利用多元线性回归模型拟合数据。4 F; Z) W9 d# g. L6 n0 l
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    3 k: s5 h+ _" O4 V& P: j+ j; U' [, D! Y) R4 Z) {
    #3
    % S9 b# b( r5 _& V- S% M4 z#对(2)中的多元线性回归模型进行诊断,处理异常值。
    ! V1 ~" _( q1 j+ D; \3 R, Msummary(lm.xy3)
    % V% U2 l' `; `) Y& L& Q6 c3 bpar(mfrow=c(2,2))
    " e0 B' D! U. H" Y1 w' aplot(lm.xy3)
    % K! s* n# s8 \  M8 }7 Z5 PoutlierTest(lm.xy3)
    9 b3 c8 R& o7 z( ptrainData<-trainData[-c(150,32,82),] #删除异常值,随机的7 s. T# e: b8 c; B, o5 F

    # m6 s( I' C2 c6 W# X2 J% H4 [#4; `" h7 r: A* v, L$ {) o1 }+ E: E  u
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。) M  A1 E9 I4 l# N7 e; z+ C
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    % g% P# A0 E  g! y0 c; {salary<-trainData[,"salary"] #引入的数据是训练集的数据
    ! K2 f8 S2 t8 b2 L! Gx2<-trainData[,"x2"]
    4 J; |* s# V6 O, }+ X) g( sx1<-trainData[,"x1"]
    3 t' s4 ]; V6 Gfriends<-trainData[,"friends"]
    1 o, V8 F9 p" |1 D! ?! ?; ]lm.xy3 <-lm(salary~x2+x1+friends)# h# d2 {, t  I* {& H

    ! U" G! `  V" w- i; b5 ]) ^/ X; h$ X#52 V4 f7 J0 T+ x
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    9 z# u- m" V* Y( k& {2 s#AIC检验,赤池信息准则,选择最小的- F% Q4 Y2 ~/ D
    AIClm<-step(lm.xy3,direction="both")
    + R. _% M4 J# W# O* @#BIC检验,贝叶斯信息准则,选择最小的; D) V) P. ~( c1 K) U8 i  v
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")% D& `" w% q# ^0 N, `
    ( K, c: y. }: x
    #69 o6 E7 ], O2 D5 a: D! o
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型! I# l# y+ p5 v+ S# c& o+ h
    #这三个模型预测的准确性大小,并进行解释。
    ) b+ ~1 r: I. [, q" sAllmodel<-predict(lm.xy3,testData)
    9 S' R5 U! Y* q1 e+ aAICmodel<-predict(AIClm,testData)4 e+ l- D- v  Z, _( g
    BICmodel<-predict(BIClm,testData)  H& W- e% d% Q5 n* w# l! ^/ p
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差1 J- N, m% E. E3 l% }( m3 D
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    8 \8 a9 p( {& ~/ `  O; h8 E  b  H, m#标准误差能够很好地反映出测量的精密度5 f* f4 c9 s( s, A9 k0 q, s
    MSE <- function(x){/ f/ Z* Z5 s/ B' b$ `2 X4 X; T4 b: L
      mse <- sum((testData[,"salary"]-x)^2)/50
    * U8 S) c/ D4 d  y5 y  return(mse)
    0 H8 @, o8 |0 `9 s}" o) x* P3 y% I% p, u, t! s
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的  q& E5 ]8 B$ o+ @0 I0 c
    MSE(BICmodel)+ _' b% E$ o# r; j) E
    MSE(Allmodel)8 H; ]5 o; T5 m7 g
    , c( s& O1 g# |2 Y
    . z* t) F8 D8 B+ ^( r

      j2 g0 z  T' i; J+ L# }
    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-7-10 10:42 , Processed in 0.474764 second(s), 55 queries .

    回顶部