QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素* N/ a9 [1 p! i% [" f3 p
    #1
    4 p. \; E6 P1 W; V- C9 }, L#展示数据集的结构( W4 F5 e8 ~6 L, E: Q4 N6 j1 J7 w* }
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")3 |4 d& ?) w) G; U1 w
    str(data2) #显示的结果有一列是多余的,需要删除0 e3 G  d' R: g7 O( A& }
    data2 <- data2[,1:9]
    " s5 X: x5 v4 x! P# \8 ]4 Jstr(data2) #删完之后的显示效果是正常的没有多余列
    9 h% J6 b" l  E! u4 o3 o- t
    5 D0 T8 X* Y& F#22 i, r9 @; ^- J  q6 ^
    #显示前10条数据记录
    1 c/ C9 A2 c+ `0 X: g6 x, ~/ T  _data2[1:10,]
    , D: V& j. W0 S4 ~, {
    9 {* |; @" ]3 P#3
    8 L/ h  c; b& W  t#将变量名重新命名为英文变量名* c' m6 [. B* ]% s  b, o
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")7 \! [$ Y4 t$ j' q1 d
    colnames(data2) <- cnames
    7 w7 D4 x9 T! BView(data2)- g4 Q3 P! M' M
    3 O: ~& u) {2 Z. s* a, h0 d0 v
    #4
    8 S& p7 @+ u( x6 a8 O9 \! q8 T#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录  |! H* l# w7 z- W2 G
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    . q) ~& j' q7 K( a5 x+ ~#View(x2) #①先算出居住时间
    / W+ ?% E: q. l0 _1 e( v/ {data3 <- cbind(data2,x2)3 U: W9 R4 w, R" M) d6 O* N
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条. @/ x5 E; c0 p1 e8 }$ M
    list <- which(x2<=0)5 o6 h" J( c) d. U
    data3 <- data3[-list,]
    9 x( L* b  T2 ^$ e4 w2 vView(data3) #删除异常数据后是125条数据: Y$ p5 A' u5 [$ n& j. g0 s2 a

    / A2 p0 J: Y7 o#5
    1 \7 R0 q0 u$ h! {# U2 f: H! q#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    ' d! N6 U* \) B, o1 H- ?5 h8 Dlibrary(lubridate)# R3 v  s3 C, v) Q8 _* ~
    date<-Sys.Date() #返回系统当前的时间* p8 d$ O/ A: \' Z: E
    nowyear<-year(date) #提取年份, Y8 _' ]/ F8 B9 k! s
    nowmonth<-month(date)  #提取月份% p; Z6 S+ K9 ~" k* x1 E$ g( k1 t
    #View(date) #查看现在的日期* g* Z- e5 d  }" p
    #View(month(date)) #查看现在日期中的月份4 ^# s1 Z, o; ]! i2 z/ H! _
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))4 L$ [/ L4 h) J3 `2 m2 M$ q1 y
    for(i in c(1:nrow(data3)) ){& A4 Z  c4 F, @3 R
      if(nowmonth-data3[i,"birthmonth"]<0){
    ; C# i+ d" P9 I     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    5 z1 j. N& h! n/ M  }else{
    ! s' ^& t' Y" p0 J     x1[i,1] <- nowyear-data3[i,"birthyear"]
    * i( h: u8 B- R  t$ Z4 x$ U6 U6 j  }. L- N# K, N$ L
    }8 I" ]- S& L* W
    #View(x1) #算出年龄x1,并加入到数据表中
    , ?7 p; V1 C1 l% F7 X, @data4 <- cbind(data3,x1)
    3 `4 L; ^. C0 w. vView(data4) #加入x1年龄变量的新表展示$ T( w) q. Y! G& f
    x2 <- data4$x2
    ( G9 P1 i! s' P5 R, {Mean.x2 <- round(mean(x2),2): a; d* L2 g: L6 ~0 P. B
    Min.x2 <- round(min(x2),2)
    . h4 y2 w  J8 v9 ^Max.x2 <- round(max(x2),2)
    6 Z# t7 W1 t/ vMedian.x2 <- round(median(x2),2)' S$ C; B- V' T' I9 f
    Sd.x2 <- round(sd(x2),2)
    , R' W7 m# Q+ f9 S6 i# J% Ccbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果6 d. h: w4 g/ o
    Mean.x1 <- round(mean(x1),2)! D/ e2 q1 _' _+ \( U
    Min.x1 <- round(min(x1),2)+ }, O9 E: _) n0 S* o8 h9 ]( n1 R
    Max.x1 <- round(max(x1),2), A1 X3 D6 k- S1 V
    Median.x1 <- round(median(x1),2)
    - K" T, c4 W, ^4 ]: }! o" gSd.x1 <- round(sd(x1),2)6 K$ ?  ]7 ^( u6 [# F5 m
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    ) [' M% A+ y5 Q9 {7 M% Vx3 <- data4$friends5 _) C" t2 T2 N% ]# t0 a- R
    Mean.x3 <- round(mean(x3),2)
    2 s: C# p; C- ^1 g% W7 sMin.x3 <- round(min(x3),2)
    : `1 m2 ?& U' t6 G1 aMax.x3 <- round(max(x3),2)
    ! M4 i7 ^6 k4 @8 A, A4 D. R& g  l" }4 J' JMedian.x3 <- round(median(x3),2)
    7 ~6 g+ l& J" r0 T1 c) F# M  JSd.x3 <- round(sd(x3),2)- s4 i! m# N; I/ [. f, m
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    1 ~" I8 y( K, qy <- data4$salary4 K  {: a+ J' U# c: P# r* w! z
    Mean.y <- round(mean(y),2)# F3 j; j  D5 j% Q- l# Z, r8 \
    Min.y <- round(min(y),2)
    + ]; s  S  \. e4 @7 H. pMax.y <- round(max(y),2)5 A4 v+ G5 P0 Q5 q( F: _. {
    Median.y <- round(median(y),2)8 U5 r( L& K3 z1 d* L
    Sd.y <- round(sd(y),2)
    : |& C% ~; n8 ucbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    1 y0 F' m2 E5 n  r) Z6 |7 H
    4 J5 o3 d/ \1 M) b  h#6
    8 E1 E+ ?" q  X# c#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    ( K  W1 n& M, i( Ground(cor(y,x1),2) #y和x1年龄
    3 |, P4 o& L% d( Around(cor(y,x2),2) #y和x2居住时间7 {+ n# b1 M$ B, w' D' |! B
    round(cor(y,x3),2) #y和x3朋友数量
    0 Y  U. O9 {$ d5 m$ Q
    $ q8 H8 I( w3 {9 @, W! q+ O8 S' }$ E#7$ G! p, V' z" o5 e( j8 X( O2 H
    #分别绘制数据集中因变量与各个自变量的散点图
    2 d( g; U9 x9 f& gpar(mfrow=c(1,3)) #布局,一行画3个图
    . |. I  ^. m$ ?. g  [7 Gplot(x1,y,xlab="年龄x1",ylab="工资y"): y: |8 X/ C8 E# z1 p
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    - T  H4 d) q7 q( I' p+ Pplot(x3,y,xlab="朋友数量x3",ylab="工资y")+ b' _' h" h0 |' ^- I9 w
    ' I6 R1 i3 p0 K' r' j
    #8
    6 B0 D, |4 g* U; Z( S; P#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。+ x2 Z: E5 x7 u! F/ k' |8 b
    lm.xy <- lm(y~x1+x2+x3)4 Z+ o- ]* H. c0 M+ S8 P# b7 Z3 @7 s
    lm.xy
    . ]1 z* `2 ?' csummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    3 e% h6 A: N3 t, x" w
    4 x" O" u1 F2 U+ M/ ~#9
    . L- o( G  B/ n* _5 t6 t#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    % n9 a( S7 H$ G8 R# Jpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列) Z- R1 W  t( j' B6 j  t! R( z" A
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布7 F7 U! O2 I1 @5 Y- o
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    " _/ |' O' R2 c% D#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    6 X1 p) F( Y0 j#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    . ?/ c9 ~) [+ f' dplot(lm)
    ( M" Y& t+ U4 a& E! Blibrary(carData)
    ) ?! z9 u1 y8 @1 w$ Y1 `# }library(car)7 V3 w: O4 |% _) D" d
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    . g+ q- U- W. Z7 n1 g% C$ z8 A. ]+ Q# K$ `4 S- _$ _
    #10
    3 e6 J" {1 i) r" v" l) h6 D- [  q#删除异常值记录后重新利用多元线性回归模型拟合数据。0 M0 \8 n4 w- T
    data4 <- data4[-136,] #删除该点
    $ d2 e; [" n" F) N1 y5 V, w: Ox1 <- data4$x1
    / n5 Q) Y; J' vx2 <- data4$x2
    3 a3 n' Z( ]% F8 N  I+ d6 ^0 ?x3 <- data4$friends
    - V" H4 C5 y1 g. z9 }y <- data4$salary
    5 b6 J5 a: m- |+ A2 glm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型" ^* {2 }7 H, J: p( O! E8 ?
    lm.xy2
    9 M. [$ b; V9 q% i9 {) r; [9 ]& r
    6 P/ w3 U3 Z* o% k9 M#11
    ! y5 [$ M, K, Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    / o3 `  N# e/ Uvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)  O1 w! r7 [4 F/ R; {' Y

    0 K4 [9 R/ k( s% p1 Z, h#124 z3 L5 r/ S- L4 }
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    ) R, Z8 B2 }: Usummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星& D+ @% \. i& ]" h* K5 E

    ; c+ C/ t  b$ y  p5 B* ~4 O& d**********************************************************************4 W& M5 T  g4 r( l+ }* d
    $ J! G* o  T% H2 W1 ]( O! g
    二、利用多元线性回归模型预测收入2 G6 u5 b0 i' q. Y( Z  N
    View(data4) #124条数据
    " r7 W0 V( b0 p" `9 A#1
    . M2 K. E9 o" ]#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    2 v8 ?+ ?1 p7 m5 X( J# Vtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    2 V- i3 J' j1 S  U5 P9 j' o" {trainData <- data4[train0,] #训练数据( ~- c5 H" V. @! p- w; @! _7 ^. I) J
    testData <- data4[-train0,] #测试数据
    1 @; L% M- [! N4 L$ ^. Y1 q4 q# P1 s) ~' Q
    #2
    6 x) e/ [0 f# S3 p9 i: x3 w. m#针对训练集,利用多元线性回归模型拟合数据。2 L6 N# B0 M' X7 l
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"]); K8 b3 r. d9 ~+ n6 j* B& [/ B

    3 j' y1 E9 f4 ]7 j  A1 _#3
    4 ^( `% _) L2 L3 X% M#对(2)中的多元线性回归模型进行诊断,处理异常值。* B" _6 H' ^" A
    summary(lm.xy3)+ n! f0 f  n7 B
    par(mfrow=c(2,2)); I6 B$ ]/ X  u! B+ x7 `8 F* L) i
    plot(lm.xy3)9 a( \4 b& O0 a, z7 V% b, ^! [% P
    outlierTest(lm.xy3)& l$ B; Y6 g& N0 H8 w, o1 J$ s
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的' P0 w5 w3 n5 ^& J6 B6 Q

    & h) ?6 N7 n, u4 S: s#4
    0 [4 L1 l/ o) F2 Y#对(3)中的多元线性模型进行多重共线性检验并加以处理。4 a2 ]7 g, i  {: ?- |" {
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    5 }! z2 V" `  [9 ~, T& R/ Hsalary<-trainData[,"salary"] #引入的数据是训练集的数据  v. G& W1 Y0 ]) t; _
    x2<-trainData[,"x2"]
    5 i3 o' {- Z. O+ @$ K6 u% H9 h& Xx1<-trainData[,"x1"]8 o- x' h. W& v3 |
    friends<-trainData[,"friends"]  F4 y: f/ g: N
    lm.xy3 <-lm(salary~x2+x1+friends)/ N# ^' ]$ [* T# J

    7 ?5 _8 w$ Z" l/ C9 Q0 W  I' ~#5# n2 q5 _  M* k, Q  ]7 n
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。3 D: L7 K/ R$ q: p! l% ?
    #AIC检验,赤池信息准则,选择最小的
    * w/ T6 ^8 K: oAIClm<-step(lm.xy3,direction="both")
    2 M, Z8 ^  y5 r#BIC检验,贝叶斯信息准则,选择最小的
    , \$ q) p4 ?2 C8 Z- sBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")& B# n( }5 A3 }  w
    ( f! n+ I  r5 A% x8 j5 M$ N
    #63 K/ @- T/ A' Q: z! \0 M: Q# R
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型' A! e! t+ T! v% G; V) T
    #这三个模型预测的准确性大小,并进行解释。
    ) @& O( B+ z# kAllmodel<-predict(lm.xy3,testData): }$ E+ C+ a2 q( b: m; k0 r
    AICmodel<-predict(AIClm,testData)1 T& R! Z3 n/ I* a
    BICmodel<-predict(BIClm,testData)
    # H6 w/ L/ _6 b) r1 k) k/ Q#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    ) F+ E. C5 v5 ~5 Z# G4 b. e#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    # U, N! v# @1 x9 u! z0 W#标准误差能够很好地反映出测量的精密度# K! b6 g2 N/ o* k" v4 e/ k8 t8 }% L
    MSE <- function(x){' W' y, e" W/ Z6 N+ R. _& E
      mse <- sum((testData[,"salary"]-x)^2)/503 Q( a* f3 l0 Y/ R6 i2 Q9 Q  J" P
      return(mse). F" o2 W0 I; t& W( ~- @# x
    }
    , X: ?2 ]1 q& F4 O7 UMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    9 ?; r. ]  i" i( R2 HMSE(BICmodel)4 q) X4 l# X" i) W
    MSE(Allmodel)! D6 L0 @/ Q% |; I! J1 b* f. V

    1 ~8 }  s& `& V+ P( f1 V& t& F3 u$ s8 K5 {- [) b
    # t% M" O: N2 k9 j9 W  G$ h/ G& H
    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-10-30 09:23 , Processed in 0.528568 second(s), 55 queries .

    回顶部