QQ登录

只需要一步,快速开始

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

    一、背景4 A3 e2 j4 ]( d# j
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素$ ~0 S' R5 K+ @
    #1
    + `) E6 G8 ^. ^. z$ D$ T0 B#展示数据集的结构/ B% s7 Z, t. r2 X- y0 J, U
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    6 t1 ^0 ~/ u. S) I. f* X7 bstr(data2) #显示的结果有一列是多余的,需要删除/ w7 u3 l$ ^& {" v, i2 [) Q
    data2 <- data2[,1:9]
    5 x: q, z4 ~7 {2 j8 f. T8 Lstr(data2) #删完之后的显示效果是正常的没有多余列- Z- u9 H4 L; [
    / E6 Y7 w5 y: q
    #2' L. H& w6 _( n; F* I7 p# k! B
    #显示前10条数据记录8 }; e8 D& c: b! Q- E( t5 Z: j
    data2[1:10,]
    # J1 \  X! R4 Q( q( U
    + ?9 y0 N8 K- k4 ]. [+ V#37 A5 u" P) z' ?! v
    #将变量名重新命名为英文变量名
    # t- i: ]7 C$ j9 u) ]  dcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends"), Q# q- O; p! p; m* a
    colnames(data2) <- cnames- t0 b2 ^$ e1 G1 w& N7 {( E5 C$ _* M: }
    View(data2)" q- ?& R! a6 \8 d7 \: \: Q
    4 y# J0 H7 I& ?6 [
    #4
    " T# Q, {: g  C: V9 ?$ Y5 O#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录6 Q) s% N* G. u" W- b* F' p
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    3 n3 H5 z9 w3 ^: O- U: V#View(x2) #①先算出居住时间
    4 }* s6 O# S$ d" S5 Rdata3 <- cbind(data2,x2)( O" P4 v& T- G/ M; V2 ~6 H
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条/ |& G9 Q. _0 |/ [, |' P. z5 u$ f5 B
    list <- which(x2<=0): T$ u$ U. v3 T9 j5 V- a
    data3 <- data3[-list,]9 r6 F$ N& A2 O# n' I
    View(data3) #删除异常数据后是125条数据" u$ F* M6 a9 q2 d* e/ Z
    9 u2 r) \1 l' S/ Z' c+ V/ i9 X
    #5
    . \$ Z' C3 {) D: Q2 g6 n#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。9 V% O: l& s  j( {5 B, f
    library(lubridate)! V8 X+ s( L4 ^) @. h5 M+ q5 G+ O
    date<-Sys.Date() #返回系统当前的时间
    ' A, M; k+ M7 v& ]2 g2 \8 knowyear<-year(date) #提取年份
    . x1 }: j6 T8 V& r# x* Xnowmonth<-month(date)  #提取月份) v- ^8 G' v  b( g( B
    #View(date) #查看现在的日期& k/ p/ ~  t4 h" v* M
    #View(month(date)) #查看现在日期中的月份! C3 @4 s6 \, j' @' t2 B7 s0 H
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))8 y2 M" s. ?0 v4 W/ r
    for(i in c(1:nrow(data3)) ){
    $ v( n# f9 \) v4 q( n  if(nowmonth-data3[i,"birthmonth"]<0){
    % h8 D( `0 Q) J) k     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    1 i! J8 e1 ?' y% I  }else{" e, @; Z# ]0 X4 m6 |4 W
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    : w/ F* j% N  u1 x% ~: q# r% D  }  [, {" T: F7 K2 N/ ^
    }5 y! Y2 J: f2 m0 l  a- Y
    #View(x1) #算出年龄x1,并加入到数据表中" }4 {$ I7 T5 q8 H& v/ T# c! s
    data4 <- cbind(data3,x1)
    1 _6 y, `3 `3 g/ c/ b6 yView(data4) #加入x1年龄变量的新表展示2 K9 o$ q, X7 z
    x2 <- data4$x2
    - t0 H7 u7 ]. {1 H+ d) a' j) ]Mean.x2 <- round(mean(x2),2)
    5 ]' W3 T3 g" S# @! B  f# ]# f7 bMin.x2 <- round(min(x2),2)* S. M) S7 v1 e" n8 b$ c* e' M
    Max.x2 <- round(max(x2),2)
    2 a# K# k, M+ Z, iMedian.x2 <- round(median(x2),2)& f% W+ z$ d$ x
    Sd.x2 <- round(sd(x2),2)
    7 H( }* s1 Y, k* }cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    , m; ?- \5 {! ^6 M, U2 LMean.x1 <- round(mean(x1),2)
    0 |) }) X1 T& |* ]  s* _2 }4 tMin.x1 <- round(min(x1),2)
    # M  _) W1 X' z3 m' }! d* C9 DMax.x1 <- round(max(x1),2)
    ! j1 `' g7 [' H* U# K% k1 zMedian.x1 <- round(median(x1),2)
    / s  w! o& ^/ f* t3 G1 J  W+ XSd.x1 <- round(sd(x1),2)1 Q; y, Y3 |' [/ T. T) D6 a
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    / v8 F6 Q( @  o1 Y3 ux3 <- data4$friends
    3 ?5 z9 o( L4 y$ `- CMean.x3 <- round(mean(x3),2)
    . h5 P5 D+ ~1 z% H' e- S7 s6 h% AMin.x3 <- round(min(x3),2)
      U8 y% p  ^1 b7 S+ W0 E2 m+ e6 UMax.x3 <- round(max(x3),2)
    ! @. f6 R9 o: v+ r  EMedian.x3 <- round(median(x3),2)- Y/ `1 L( G  x( }% O
    Sd.x3 <- round(sd(x3),2)
    5 M* t+ i- y3 u9 acbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    3 |" P& j1 ~: S9 F1 w9 `- K" Py <- data4$salary  a& t: v, |: L
    Mean.y <- round(mean(y),2)9 @; D" ?( I* Z- Z
    Min.y <- round(min(y),2)
    + `) e9 @% i2 x; e2 p% _- A  m, yMax.y <- round(max(y),2)% C. s: \  F& u; ]& `8 C  \4 P8 I
    Median.y <- round(median(y),2)
    " y% D2 n5 _. q5 @1 SSd.y <- round(sd(y),2). b: T9 Y6 |; h. a( b
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果/ M  q0 v  e8 }& i( P5 |9 S/ k

    - T5 U9 M* a8 U+ T#6
    1 X, u) C$ B" Q% `8 }1 Y9 k#计算数据集中因变量和自变量的相关系数,要求保留2位小数。0 w8 x% o% u9 R6 k
    round(cor(y,x1),2) #y和x1年龄8 ~3 f% o% H0 C% v
    round(cor(y,x2),2) #y和x2居住时间
    8 g7 B. \% f  ?5 D4 L7 pround(cor(y,x3),2) #y和x3朋友数量
    4 M6 l1 O, G' s, J* [/ F8 t' e1 j4 o8 w: p% ~' x
    #7
    : G. o* M/ t1 O( h' s: r- t# z#分别绘制数据集中因变量与各个自变量的散点图' D6 j% ]- U9 Y7 T9 G
    par(mfrow=c(1,3)) #布局,一行画3个图9 p: e: I/ T2 t
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    * }- m# o6 O; s5 N- q6 }9 p8 Xplot(x2,y,xlab="居住时间x2",ylab="工资y")- i$ u7 c1 w! l6 ?; F3 q
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    3 V5 M" ~0 {8 m9 Y' v- C5 @
    + E, O) t$ L1 z( j; F#82 n& ]6 b2 m7 a$ G- a; C
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    # f4 S5 C# k% {5 n, x# W" ^6 {lm.xy <- lm(y~x1+x2+x3)
    , @4 C& G, C9 b8 z$ slm.xy
    , C; F* ?  A9 J3 N. Vsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的& I% m2 j$ I% R1 u

    + a: P# \& O7 d3 X( G8 y#93 Y" U  j0 b; I6 l3 N
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    * H  K' o5 J$ U) P/ Fpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    ( t$ h) ?( z( f& H+ ~7 U#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    % c( s9 E2 s" X$ O. U#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。/ s9 R) J6 n7 }5 W
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。% C$ R+ L1 x; H" v
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    : b: A6 Q2 P- \" J- r3 o& dplot(lm)
    " z% ]. o) {/ X' e1 a/ I; K, Olibrary(carData)6 v) a5 c% Y+ L& U( k+ i
    library(car)0 B- y# b2 i2 `0 H  i" I
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    2 D* R  ^, T( P+ ^% `, g
    , O, G4 x- [( ]5 K! \: A#10+ f: g# t5 O3 z6 ]' N* q$ R* Z; {) ]
    #删除异常值记录后重新利用多元线性回归模型拟合数据。/ W* h5 C2 v. Z/ T4 m4 o6 h
    data4 <- data4[-136,] #删除该点
    " x. ?) L+ t: K8 j8 c) cx1 <- data4$x13 f* X( N7 {% W0 P9 z' w
    x2 <- data4$x2
    3 m# @' X& Z7 a( }x3 <- data4$friends
    : V1 t6 W9 q0 n& m; c, E! c3 n+ By <- data4$salary. }2 Q; x% T& L2 r1 M- p
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型5 q. X5 }9 D6 F% l5 y# O. G
    lm.xy2
    ' n, k1 G7 H! {
    , S: z# V: S0 s8 O#11
    # r. a+ V1 r4 q/ I#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    " s" t: h# h! G4 ~: a' e" yvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)# ~4 D. ?4 ?# d0 \4 C6 [- d  s
    ) C- P( b( T- F6 J7 U
    #12
    % J. s. A+ u; k/ z7 p) ]! l#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。% B  V6 \3 ~4 {, M2 Y
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星+ g  q/ Z5 X: t

    3 Z. S/ K! ]1 X( _3 G5 @**********************************************************************
    % g3 C) G) R6 V* J5 ]7 s$ d2 u& e$ n5 @1 P3 e3 D& f
    二、利用多元线性回归模型预测收入
    ) q  v8 C4 P( f" ]3 gView(data4) #124条数据( b4 J6 _* K7 m% |# |& P; o: Y, y9 _
    #1
    : G! t) F- q6 C/ B5 A#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。, ~/ y& H7 n" V. M) B7 v4 M
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    8 ^7 r: h8 e& y: V' C( GtrainData <- data4[train0,] #训练数据
    + w, j& x: T0 {9 e" {) j- Z! EtestData <- data4[-train0,] #测试数据8 n0 e. Y2 z$ J+ X8 U7 J* W6 D
    7 S$ B$ G6 t# P- v
    #2. V% e+ H7 a: T5 O# l9 C* g7 L
    #针对训练集,利用多元线性回归模型拟合数据。
    + k& U8 y! A0 _# k/ Glm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    7 Y9 y( M2 @6 _; K( ?& O0 x* W( b9 a/ p
    #3
    5 ^. n9 }$ \9 }. s3 j. r#对(2)中的多元线性回归模型进行诊断,处理异常值。
    5 r8 q$ z2 ]. [) z8 h; q2 {5 J9 a7 Fsummary(lm.xy3)6 x4 r1 c$ G# J0 y7 Z4 ], B1 w1 J! Q
    par(mfrow=c(2,2))
    ; `  e1 [) I0 _) t- wplot(lm.xy3)" Q" v3 T) \2 U1 c+ Q3 c4 T  }
    outlierTest(lm.xy3)  q, d* ^$ T, C" U% [
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的3 ^# I! Q9 Z# {, b

    : c4 n/ z4 p& V; m5 C#4
    $ m! B1 @5 m# b. X6 U- n5 j. ^; a. e#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    3 o4 r9 o) o5 }+ }vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    ' K/ L/ Y( E% h0 E! Fsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    . u# h3 c4 c' H8 w2 p3 ?x2<-trainData[,"x2"]
    2 Y9 l; X/ T0 b- y1 Zx1<-trainData[,"x1"]
    + W1 g' `7 F1 N* V; m9 u- `friends<-trainData[,"friends"]
    ( v( ?" q) x; O: l8 Vlm.xy3 <-lm(salary~x2+x1+friends)% [4 ^4 E( K: m0 F4 g

    2 ]7 R; w# t# q3 R) I#54 i# R9 {% Q- C  @# m# ?
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    0 U! d  {! C2 T, f) G#AIC检验,赤池信息准则,选择最小的3 }, G% t3 ^) F* p- E: m( v1 Q
    AIClm<-step(lm.xy3,direction="both")
    * [( l! d. O% o" z# S  Q, ~#BIC检验,贝叶斯信息准则,选择最小的2 o  l" P8 [4 H* E& P
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    & y: t8 c& n5 {, B; z9 ]+ m1 v
    # \1 C+ Z) S  A1 A0 ^& U#6
      r5 V$ }$ _5 n1 R  u#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型7 Z, D2 c8 s: Z* y
    #这三个模型预测的准确性大小,并进行解释。- n" F! h/ c9 E2 u1 U: w$ X# W
    Allmodel<-predict(lm.xy3,testData)- h( }, C( N5 W% \2 B# h
    AICmodel<-predict(AIClm,testData)
    & A* ~' Q6 I8 \& ^4 y+ hBICmodel<-predict(BIClm,testData)
    * }, S5 P: x1 M& ]& c#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差9 D0 @8 d/ d& K$ R1 G; j
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    6 {$ D1 q4 F3 |; E#标准误差能够很好地反映出测量的精密度' _3 J; b* Y$ i9 g( w$ r' P# R
    MSE <- function(x){
    1 s- J; R+ Q, C% ]  mse <- sum((testData[,"salary"]-x)^2)/50
    8 r8 k  p. ?/ X  return(mse)2 e0 X" \5 Z% F$ J  e$ P
    }/ _4 `5 N$ [- r; ~+ t' ^
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    & {" G7 l1 {/ E' \6 M5 b. HMSE(BICmodel)3 e, L4 K& e# ?, C$ y
    MSE(Allmodel)
    / d# }+ t1 s4 C( _. M. c+ w- I# L. [
    2 N1 z( a3 T- n$ P: D" i& g$ Q: S) W! ]9 h5 i# B
    / m5 \: x, U) e: _) z% D
    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-10-3 12:45 , Processed in 0.495015 second(s), 55 queries .

    回顶部