QQ登录

只需要一步,快速开始

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

    一、背景5 {( j9 [2 }" z
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素1 l- L% ]3 @" J9 B# b& s' M
    #1
    : ]  k2 J) o( K4 o: x#展示数据集的结构7 i" o  X8 z- D* Y: a' m' P
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
      c3 o$ h0 M$ zstr(data2) #显示的结果有一列是多余的,需要删除! G; O0 a9 G! D/ P# g
    data2 <- data2[,1:9]6 T$ Z; y1 n- P* i
    str(data2) #删完之后的显示效果是正常的没有多余列, C0 N; J+ h. |) V

    . N* I2 K5 S3 a" ~- A) X6 a#2( K8 E5 a* P1 e- O2 [& ~
    #显示前10条数据记录) D; K$ A& Q. ~: k0 G' x, y0 q
    data2[1:10,]
    6 d9 r/ z* q8 P+ y4 L! N( {: y4 v6 [/ |$ i3 _( W( R. }9 E+ j
    #3; q6 D) |! Z& l& h' o
    #将变量名重新命名为英文变量名4 }) E, \( w& ?
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")) P4 i6 E& f  x5 K, A; b0 @
    colnames(data2) <- cnames  K; T& F0 F2 i& I- Y
    View(data2)
    0 [9 f' t+ X0 D5 B, e7 R
    & |' G: o2 Q. j8 G- I& v#4
    7 `/ l$ m& i  f5 H. K#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    : }7 O( ?7 w8 S: Q& D1 _5 h, Fx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    ; p: c, M! E6 o0 {$ a- }0 y2 i  ~3 i#View(x2) #①先算出居住时间
    7 ~+ S: `) r) Gdata3 <- cbind(data2,x2)% f6 T7 Y) v5 J6 W( t+ I  }* Z4 N. U5 R
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    $ `# B0 s+ [0 u  I6 rlist <- which(x2<=0)/ \+ ]* J' u- V* i' X+ `1 Q1 x* Z
    data3 <- data3[-list,]
    4 `* _2 N7 ?' x0 q: y, e! w, Q6 @View(data3) #删除异常数据后是125条数据
    ( B- a1 o, x2 _2 i
    2 O; ]6 R* c( x2 E: Q#5
    ! F* ]3 I) r: J9 A  K' f5 _) A5 w1 z#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。: F. D2 S* E1 m
    library(lubridate), F* q$ @. j( N9 v) F' l  m- ~
    date<-Sys.Date() #返回系统当前的时间; P) f; B* Q; {% _$ G1 V& `) V
    nowyear<-year(date) #提取年份
    ( t: P$ K7 {8 i# G! q) Mnowmonth<-month(date)  #提取月份
    # J" y% a0 \/ c#View(date) #查看现在的日期
    $ H, v" M8 j! w/ k* V; d! y#View(month(date)) #查看现在日期中的月份* `+ |0 A* p7 U" J' N) P; N+ t
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    0 |/ m1 s+ F1 Zfor(i in c(1:nrow(data3)) ){* \7 l( A  I& D9 a; Y% ^: H2 N
      if(nowmonth-data3[i,"birthmonth"]<0){8 Y5 y3 f9 W; `  ~, m
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    7 l! B0 M* c8 k9 l& E% e" ?; A+ b  }else{
    0 l5 Z" e" g' f3 \% u( a% \# c) W* @     x1[i,1] <- nowyear-data3[i,"birthyear"]
    " ~9 y  V, A  Q. S3 w  }0 r/ O* i9 L# ]" R+ n8 W( e! Z# `
    }+ R" y. d2 L6 `7 e; H6 p+ ?
    #View(x1) #算出年龄x1,并加入到数据表中
    5 L! ?- T. m& P0 D( e9 e' ~data4 <- cbind(data3,x1) % j& ]) x- P. Q/ h, w( r9 }
    View(data4) #加入x1年龄变量的新表展示
    ) |% @9 p3 m8 g- i9 j* y- M! Ux2 <- data4$x24 E8 B; J8 f% X: c! k7 D) `2 H
    Mean.x2 <- round(mean(x2),2)
    7 _+ o7 I2 l0 |/ q4 h- C1 WMin.x2 <- round(min(x2),2)
    , j- e- u0 m" LMax.x2 <- round(max(x2),2)4 D  [: b2 z9 c
    Median.x2 <- round(median(x2),2)
    * f: G! H+ `; e9 BSd.x2 <- round(sd(x2),2)
    9 _" e" y% F9 c% K' v9 U: gcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果+ N- c# u: J1 I% L9 k
    Mean.x1 <- round(mean(x1),2)# J% h5 w( m. x, t8 G8 N
    Min.x1 <- round(min(x1),2)
    & B- W5 `+ p8 I! s8 F) \  }, G$ QMax.x1 <- round(max(x1),2)
    ! `! }9 i" T+ B7 \. }/ UMedian.x1 <- round(median(x1),2)
    , _: a  f- P/ Q1 [. ~+ a% dSd.x1 <- round(sd(x1),2)- p2 H' a* q0 F# h$ p, Y  d* ]
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果& H6 h- O! ^0 a  p$ W
    x3 <- data4$friends
    5 X1 p; ~3 @0 [# b! mMean.x3 <- round(mean(x3),2)
    . J" w# v  d7 u) Q3 a- Y9 {Min.x3 <- round(min(x3),2)+ F' {0 f( P7 y# F, y4 W* j
    Max.x3 <- round(max(x3),2), X, T$ Y4 N: F
    Median.x3 <- round(median(x3),2)9 S# P3 I) }9 r1 Z6 J" k
    Sd.x3 <- round(sd(x3),2)
    0 p7 `: X  L" L- p' Ucbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果) q9 k; I  |. o+ f
    y <- data4$salary9 @5 J' C  n) r4 W
    Mean.y <- round(mean(y),2)9 |! M8 }9 i0 P
    Min.y <- round(min(y),2)0 ?. ~$ E: U- X. P, x
    Max.y <- round(max(y),2)
    5 l1 \0 ~# G. e0 N7 DMedian.y <- round(median(y),2)
    ; ]0 e! o# w( s0 |& b2 \Sd.y <- round(sd(y),2)
    2 t" I% I" X2 S) `+ S, Bcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果/ b+ S9 r5 E* @* ^9 b$ M/ r

    4 s: h7 w# Z- B#61 d/ z  n* y% C. `8 L1 M* [8 z
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    + k/ a' O- ~' V; z/ c  N2 K  r: r/ ^round(cor(y,x1),2) #y和x1年龄) F: x: o6 s* \# l* y2 y8 m- B
    round(cor(y,x2),2) #y和x2居住时间5 u% X2 W( n7 Z; r* ^# J
    round(cor(y,x3),2) #y和x3朋友数量
    8 w* c3 I& e) S
    / E* g7 W$ G7 t$ }  o#7: S' Q% R9 w+ ~/ T; {, l: v! N
    #分别绘制数据集中因变量与各个自变量的散点图7 W, @! T" O  B+ f% D
    par(mfrow=c(1,3)) #布局,一行画3个图) t& c' a2 u3 L6 {
    plot(x1,y,xlab="年龄x1",ylab="工资y")6 \, g; `2 i# x* W2 m
    plot(x2,y,xlab="居住时间x2",ylab="工资y")% J/ L! `5 o  i$ u
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")! F5 E: Y& x. ~

    8 D9 k( R+ |8 d#8
    : S. n* R+ `* z+ W" }#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。& [7 Z( C# L- V1 ~5 r. m( n% X1 }
    lm.xy <- lm(y~x1+x2+x3)
    , I* }7 [  c% q4 w* f/ {# }lm.xy/ t4 B  f' n3 |7 `3 D- t" o
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的) \% [. m7 S! B4 h

    ; z9 L1 D) G0 X#9
    ; F/ J# n( ]9 E#对#8中的多元线性回归模型进行诊断,确定异常值记录。* k7 U; W1 z1 x) ?# _% e
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列# Z! ?& I6 L6 O: A# P/ ~- ?8 {9 t
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    4 L0 O, e  V  r) O" ~0 S1 T" K5 ]#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。! I- z7 _7 C+ J' X- f7 ^' Q6 n
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。% c) S) o/ |" T' [: S7 J4 k  S) ?
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    5 Q7 q6 X) U% c& N2 S; Aplot(lm)% z# O$ D. B! E
    library(carData)
    # e/ T4 M8 K$ f1 @library(car)
      w# W, n$ G) F( g- eoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
      h, ?. o3 V4 ]' t
    7 Z& O7 ?4 h! o, e) Y#10
    * \" p: a: I1 Z0 V$ v#删除异常值记录后重新利用多元线性回归模型拟合数据。) _! D5 ]3 g( m% R6 F" w
    data4 <- data4[-136,] #删除该点
    * p: X$ ?( x8 p  Hx1 <- data4$x1; a& X# B; m( U) p( t* @0 c
    x2 <- data4$x26 G" s8 X% L% f& e$ A& M, m+ t
    x3 <- data4$friends: t' z8 {  |# A& c- r, Q6 v
    y <- data4$salary5 }- U5 a: O6 {# {1 i5 C
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    5 |3 f4 o" C/ M& W4 b. \lm.xy2
    8 N$ g* O) I! B) h+ a# ?4 Y8 u3 K. z9 P- T" p3 D
    #11
    4 ~, R$ @$ S5 o8 x$ Z, q0 Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    . h, f, G8 o. d* Y* [2 Hvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    ) k& O7 F( A% _* r/ S" G; |6 o! F$ J* d9 ]
    #12
    % t. B! J9 e) u1 s#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    * K; Z+ L) `' k4 z: e8 i8 H  Bsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    - w$ d$ ^! @! U: |& V! D4 C6 T
    6 p5 |' J8 y( x- {% d. R: `**********************************************************************  v! c- H! J  l3 x2 _  e

    ! Y# B) }" l( q" y. h* @6 U8 U; H0 W% s二、利用多元线性回归模型预测收入5 C0 ^( d" {; X5 Y
    View(data4) #124条数据" r3 L. B; |& k) [  R0 T5 y
    #12 J" R5 c& e$ r; w
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    4 a% ^/ \& Y; v+ ]train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集; R% f3 B$ b+ S. h7 w2 s
    trainData <- data4[train0,] #训练数据
    ; R( e# {, a5 ]  qtestData <- data4[-train0,] #测试数据
    & U% s4 l+ J' A8 f/ {& a' M( C4 ?+ |8 X1 U0 Z
    #2
    ; R4 ^8 i6 O+ t#针对训练集,利用多元线性回归模型拟合数据。
    : t0 l( i2 l( A" P0 O" |5 m3 Nlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    ( N$ m2 m2 j0 O5 Q8 n+ k& }& E" N6 \: c2 p0 |
    #3
    3 l6 d& Q, V: ?#对(2)中的多元线性回归模型进行诊断,处理异常值。- x8 Y+ Y$ S( X6 q
    summary(lm.xy3)3 v3 ]3 Q4 u2 U, T9 ]; ?8 A4 w
    par(mfrow=c(2,2))
    / y) P$ }1 L# Q( ]. P3 vplot(lm.xy3)8 T/ |" N7 L" Y: y
    outlierTest(lm.xy3)& M# ?. W. M3 [6 }# e
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的  v) N4 O8 O# R
    1 I; q+ K& S+ g" g( D' g" G4 w
    #4
      F! P. S; P& d4 ?: S# H3 T3 _8 @4 x+ d#对(3)中的多元线性模型进行多重共线性检验并加以处理。# M) m. u5 P) {" F
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    " m, r* g' u' Tsalary<-trainData[,"salary"] #引入的数据是训练集的数据$ I7 U) l6 Q0 D' e1 `
    x2<-trainData[,"x2"]
    . b" v3 s3 |4 M  px1<-trainData[,"x1"]
    ' R- Z" `* @6 i  ffriends<-trainData[,"friends"]
    9 v, B  T1 w5 J- }lm.xy3 <-lm(salary~x2+x1+friends)3 z. ]/ L1 p% s5 _* Z2 B6 }

    8 N9 n& {( g# c" S5 b! G  x#5, H$ Z' C5 I$ q+ K2 d& C
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。! {: a5 _& \  x$ j
    #AIC检验,赤池信息准则,选择最小的
    ( d. L7 f1 Y7 H: c/ T; A1 ^/ N3 p/ u9 sAIClm<-step(lm.xy3,direction="both")
    & @: @* t. C- Y9 z; G4 R#BIC检验,贝叶斯信息准则,选择最小的: q6 R; B& f3 l! @8 E; M
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    2 }4 K& ^) ]1 \2 S2 m$ r% y
    " W  J8 _) l% S9 V2 W#6
    ; H* u+ ?9 t% \1 S; Q+ r5 P) M#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    ; l% L- p+ R# P2 x2 ^# J& r; c#这三个模型预测的准确性大小,并进行解释。9 D3 W1 d& t+ E' k6 V* E
    Allmodel<-predict(lm.xy3,testData)
      L; X4 h) M# ^  O% {AICmodel<-predict(AIClm,testData)
    . H$ P) g/ c" g/ J5 UBICmodel<-predict(BIClm,testData)+ E8 Y% u, R  A8 w) M; F; ?
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差: E9 i6 Z4 m, [2 }+ a% n4 M( x
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根) q: T1 j* H; x0 W8 `; B9 _$ u
    #标准误差能够很好地反映出测量的精密度
    : a) l' \$ ~+ A7 \' d% f- jMSE <- function(x){
    0 y! _8 }4 F: i7 E+ j% Z/ u  mse <- sum((testData[,"salary"]-x)^2)/50
    $ q+ s. M: Z! g  return(mse)
    ( h8 \! D4 @) X}
    ) C6 X+ f: m) X7 U8 \. ~) zMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    % `( q3 e0 M$ V, Q2 l* q1 _6 O4 t9 EMSE(BICmodel); n7 u9 }6 b$ H4 u
    MSE(Allmodel)
    1 ~$ p& H3 O% M# C7 Z: T* ]0 H4 e* w5 k! J! q% c
    8 Y8 W  y. a* {& ^/ M- S: J
    7 g* i" H, W; m1 P" W! V2 a! P, {
    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 13:20 , Processed in 0.425780 second(s), 58 queries .

    回顶部