QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3317|回复: 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 n! q6 o3 C9 S: ?! ^' \! s
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    ) ?  `, c( U8 e/ K6 r#1
    % G* v- d- p2 A8 g5 Q; v/ D#展示数据集的结构
    ! x- j- T8 Y: L& cdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    2 Y" t& x7 V; b& I2 A$ O* ystr(data2) #显示的结果有一列是多余的,需要删除
    - l% \1 E( D9 M2 \. y& y0 D9 Ldata2 <- data2[,1:9]# J9 L' |% I: X: L
    str(data2) #删完之后的显示效果是正常的没有多余列
    4 B  S7 A7 P! c7 @
    - Y1 B, }/ x( T- j#2! u8 f& N4 h. g
    #显示前10条数据记录: Z- F  m% M1 ?$ u) A  h, _0 u
    data2[1:10,]% F' Z& ?) h1 C$ R& K

    ; s$ f! q& @/ H3 Z#3
    . f5 {6 C; \6 |& e0 K! I#将变量名重新命名为英文变量名
    1 N' Y+ S1 f: A3 s" L4 T$ ]cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    % @8 f3 S& N9 ^4 K9 j- mcolnames(data2) <- cnames
    $ s3 }& I5 T) ^, W. Z: wView(data2)
    ' q5 t- e: z! A/ j1 p* l# e- v3 u
    # @$ r% x# c( R; ]6 e#4
    0 o( n5 I; W( c/ B3 }#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    ! n$ `9 H! @! h3 v; Ix2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))6 n8 t& b5 a+ s
    #View(x2) #①先算出居住时间5 Q1 \) k% l5 b, Z4 q9 s
    data3 <- cbind(data2,x2)$ h& y7 l6 \" s4 N! Y/ h
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    ' v$ \1 K4 o3 e# a5 a$ wlist <- which(x2<=0)
    " g$ b9 ?: A7 R; j# zdata3 <- data3[-list,]
    1 T  y" A/ h6 V6 z9 TView(data3) #删除异常数据后是125条数据
    . h0 E4 q& p) Z' U# W' `; ^* ^' w+ z/ E- |8 z
    #5
    ' m4 e  |  ~4 B, J; g2 [#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。& h' B2 R9 a4 @2 p
    library(lubridate)
    ( s2 L; E/ t  x! mdate<-Sys.Date() #返回系统当前的时间
    3 g2 }& m; L) {nowyear<-year(date) #提取年份
    7 l- w& A: s4 P9 P/ O( U% inowmonth<-month(date)  #提取月份6 I& \* Y5 O0 C
    #View(date) #查看现在的日期8 ?# ~3 N/ Z8 @' ?! o! S8 \2 b2 z3 F
    #View(month(date)) #查看现在日期中的月份
    9 b9 {4 T% C( F- d% i" ~, mx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    2 F: J  E$ c2 ]) n% ofor(i in c(1:nrow(data3)) ){* y' G- X# p; L7 r
      if(nowmonth-data3[i,"birthmonth"]<0){* x( x- A( f9 [0 F0 N. y
         x1[i,1] <- nowyear-data3[i,"birthyear"]-13 x$ E! e0 l- p1 c+ _  V! g
      }else{  d2 R( o. ^7 D$ s5 n5 [
         x1[i,1] <- nowyear-data3[i,"birthyear"]# c& w( W/ ?3 E8 m% A5 a/ e0 S6 C
      }* }( N  W7 E  ~
    }
    & z* l) g$ B  F8 S- z  I#View(x1) #算出年龄x1,并加入到数据表中8 C9 x$ Y$ b3 S4 G+ x/ m) i
    data4 <- cbind(data3,x1)
    4 B6 e4 n/ i4 J+ ~View(data4) #加入x1年龄变量的新表展示
    * n2 s9 C# g! c/ a1 h5 ^x2 <- data4$x2
    ! R2 e. e& O0 y9 LMean.x2 <- round(mean(x2),2)
    3 n7 M& ^& S3 J, y$ PMin.x2 <- round(min(x2),2)
    / R. a" j" W7 k1 Y8 jMax.x2 <- round(max(x2),2)
    ' l) R4 G2 ~& M2 H; g2 l7 LMedian.x2 <- round(median(x2),2)
      |3 z6 `6 C$ L  K/ `5 T2 jSd.x2 <- round(sd(x2),2)
    % {+ k% t9 {8 a! jcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果1 f- j! b% O. j( C
    Mean.x1 <- round(mean(x1),2)
      J2 ^$ t' y) v# p( L0 H# FMin.x1 <- round(min(x1),2)# M4 V: R. R* ^- f! }  `9 {7 |
    Max.x1 <- round(max(x1),2)
    - ?2 Y. _; o' Y, D& {8 v. OMedian.x1 <- round(median(x1),2)1 k" n9 o2 X/ l- S$ j
    Sd.x1 <- round(sd(x1),2)" @0 Z# a8 l$ u1 N! ^8 A* G! F
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    : @1 ~2 \9 t7 r- e+ h7 i4 W! I" Ux3 <- data4$friends
    : W; s! t( u+ V5 h3 p3 H1 K4 K) nMean.x3 <- round(mean(x3),2)
    / w3 E& X7 X1 ~) o5 V- r- dMin.x3 <- round(min(x3),2)/ }2 J7 N8 G3 A5 x$ n
    Max.x3 <- round(max(x3),2)% r. r' |, G) P. C5 e" [) O
    Median.x3 <- round(median(x3),2)
    6 n/ e/ ?0 j' _: a; S5 I8 NSd.x3 <- round(sd(x3),2)
    , a  n& \: p2 v/ w& A; B  Jcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果6 P. j, z4 g6 \& P: \. K
    y <- data4$salary
    ; N4 ?3 f& c9 c2 t, C) ?Mean.y <- round(mean(y),2)* Y$ d) b) V$ L8 g% V/ x
    Min.y <- round(min(y),2): L8 ?7 h. s2 i" d; K
    Max.y <- round(max(y),2)# J4 w+ i# V9 q* B+ I
    Median.y <- round(median(y),2)" _+ x0 C% c* N! K
    Sd.y <- round(sd(y),2)
    5 }. A9 y% L( ?) j. }- S& A8 Fcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果/ _( Z" G! q. O% g' ~1 |' I& H# M* j
    7 K- v1 r) o+ W" R( h' N3 _
    #6
    * w0 `( E  H! N* z/ J% l6 x#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
      W* t& o" `) f- y/ X3 g1 L: N1 Pround(cor(y,x1),2) #y和x1年龄! }( j; F: T* [: Q4 `3 |
    round(cor(y,x2),2) #y和x2居住时间
    1 w* s+ g$ U0 J' xround(cor(y,x3),2) #y和x3朋友数量
    2 u2 V* ]% H. U* A# e! ]$ i9 \" H8 Y4 T% _0 y. E
    #73 Y+ T- N( f: o& d7 X2 |- q% `
    #分别绘制数据集中因变量与各个自变量的散点图
    ' R( V/ z- U- t; [4 H( J5 v# l3 `% spar(mfrow=c(1,3)) #布局,一行画3个图
    " Y; m  O" d& A3 X3 Rplot(x1,y,xlab="年龄x1",ylab="工资y")
    & W" a0 |$ ~/ C+ j$ eplot(x2,y,xlab="居住时间x2",ylab="工资y")
    ' A& A. |  s( S3 ~! xplot(x3,y,xlab="朋友数量x3",ylab="工资y")$ D6 R7 }4 a& z$ m! P1 B  v

    4 Y6 G: c, N4 p0 e. @#8
    7 m1 a3 P! E& i% o1 ~- W# F#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。& Y$ P! K9 @/ Q7 Z; U
    lm.xy <- lm(y~x1+x2+x3)
    : G  |1 G1 j  K; X3 O2 V8 e. Ilm.xy. p7 P( M* ]! S
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的/ ]3 d$ M7 ]+ q' Q$ |9 u

    # V: p5 `. c7 I1 w#9
      o+ i+ t9 ~) M#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    " V- R% S, F3 k" w# r, Hpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列. L* S$ Z) @1 }- ?, D
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
      @4 I3 ?" ]3 c$ Y4 p- j#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    2 J( g8 |. \& }7 Y% `0 }- y' E#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。% F0 E4 p+ }' K4 }+ j, b
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    ) i+ F, ]4 y, Fplot(lm)
    ' S0 `  k, E: j, y4 }- P  Llibrary(carData)  G2 x+ W/ k% X! b3 W8 r% e' s1 v0 M
    library(car)# A. m+ y! T1 A0 v+ S  }2 F
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    - B1 T: I& w/ A# b
    0 ]3 H/ J" C# M* O+ B0 _3 L1 K' W9 E( Y#10
    5 w7 m5 l+ [& ~; P1 E" |#删除异常值记录后重新利用多元线性回归模型拟合数据。  W/ p( w0 ]2 ]9 n$ I
    data4 <- data4[-136,] #删除该点
    ) g! J3 s2 }' q, D  A% o1 lx1 <- data4$x15 H2 O, ?+ z5 \$ h' Z. p
    x2 <- data4$x22 P  L1 [4 U  I, U/ e9 ]1 g% [5 y
    x3 <- data4$friends0 b/ H7 b2 U; `6 H! T: a
    y <- data4$salary
    . }6 Q( K/ K' [5 X; ?lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    . ?1 K1 s" L" Glm.xy2
    9 S" X& \0 X2 V
    7 [$ p: C5 W5 i4 W# v* ?) ]; x#11
    5 D' ^2 s8 @) |3 |, Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    1 J* D& A8 W" `! x6 {( M& kvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    / ^( ^* b4 m; i' F2 ?' l6 i5 P6 {6 l: ?7 r; E; C
    #129 g* @9 v7 \1 g8 i% G. y* b. l
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。3 Y2 D4 |; j+ h. U' Y* N/ c
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    ( C' \& X7 N, J
    * ?" V5 K; v! F  e, X7 n**********************************************************************! `3 o* E* c% r. P6 D8 p1 b

    + c& h* `3 I& k二、利用多元线性回归模型预测收入
    7 s' G% M9 |2 rView(data4) #124条数据
    9 j: R1 I# S, l/ f" b#1* S$ U: |4 G" z$ h- v1 R
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    5 \4 z9 B* P* Ztrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    % }+ l  o. t, M* b+ atrainData <- data4[train0,] #训练数据
      ^3 Q4 Z3 G- M/ ~  O" DtestData <- data4[-train0,] #测试数据& @' W/ C4 F! \

    % {" j1 F( d9 i' z* G% H+ ~9 h#2
    & r' Q$ [& \$ U#针对训练集,利用多元线性回归模型拟合数据。
    3 r  H) j/ H, @1 G' U  e5 ^7 h* Z! wlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    ; L5 D  I3 ]- W: c
    " s' O) A, F1 s, y#3
    3 N* O& H" H/ Y' V#对(2)中的多元线性回归模型进行诊断,处理异常值。
    : W& D' {- q4 I6 }summary(lm.xy3)' T! V4 _" v$ [  |* @
    par(mfrow=c(2,2))8 ]8 a) }) G" B$ g1 A
    plot(lm.xy3)* |9 e8 u+ {0 A8 q8 m. S% A3 c4 e) X% F& a
    outlierTest(lm.xy3)
    , T$ _1 ]& ]2 e, [* v7 D$ ftrainData<-trainData[-c(150,32,82),] #删除异常值,随机的. \( z7 o5 j7 ]
    ' N( n6 q; r- s& f( ?
    #46 U/ g2 t1 |  w6 T% p" C9 J3 T
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    & q5 r- k' o/ g6 B. M7 dvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    ) b" N8 ]- S1 c5 c5 c- jsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    7 t5 E7 a( F9 l) v: l" Zx2<-trainData[,"x2"]+ e& t0 K( {4 n2 o! b
    x1<-trainData[,"x1"]6 W5 w+ W/ E1 ~- }' I
    friends<-trainData[,"friends"]: U7 B3 ]. Y$ k+ \! w0 l! I
    lm.xy3 <-lm(salary~x2+x1+friends)9 P" z" u! t  p

    5 Q* R# a$ C& ~2 u/ x#5, {( j2 H. r4 q# b  z5 J# q# U" j! `
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。
      [! r/ y4 ]$ P& d5 O. M' e* F#AIC检验,赤池信息准则,选择最小的3 b) E5 s% w- V. ^  q" {
    AIClm<-step(lm.xy3,direction="both")
    8 t: P! |1 c, Q2 l- J" k7 a" E  R#BIC检验,贝叶斯信息准则,选择最小的4 k: K: q( r. U0 Y4 ~3 F
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    4 ]  W: R- F, f- m( ~
    " k7 n2 H  Q5 V9 \#62 Y6 t5 w1 X) Q  m% W
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型( x/ ]% A* D% k: g/ |" I& W
    #这三个模型预测的准确性大小,并进行解释。
    . F% L* V0 m0 t; q# u" kAllmodel<-predict(lm.xy3,testData)
      H7 j5 }/ p, m8 IAICmodel<-predict(AIClm,testData)1 U! Z7 D0 E) y1 P
    BICmodel<-predict(BIClm,testData)% A- {4 [- T8 Y6 G$ i) K% [& J0 _7 n
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差$ o4 d! f% D4 I' F! {6 E
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根5 ~' n+ z/ D( w* ?% Y1 w
    #标准误差能够很好地反映出测量的精密度
    + s/ W! _4 p* u$ b' V' `: I; mMSE <- function(x){
    + x* r1 ~2 |( s$ W( B5 J: x  mse <- sum((testData[,"salary"]-x)^2)/506 R  L/ v8 \+ g" q. @. @) m+ U5 a
      return(mse); J8 s. b) o% c
    }
    5 N# u; [! c4 F0 SMSE(AICmodel) #AIC/BIC/ALL是误差最小的
    ! K; Y( R3 I0 D; e; G& x/ iMSE(BICmodel)
    9 x- U$ j7 t( O3 O' o( q, E" O# l' N9 cMSE(Allmodel)
    2 W  U& H. [, S: p$ `
    * ?3 R$ s( Z; d+ j
    $ z5 ^1 K; W% |5 Q9 V8 G! T3 @: n9 ~1 e1 y* n5 C# H! G. O
    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 08:22 , Processed in 0.435988 second(s), 55 queries .

    回顶部