QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素' I7 w/ J+ x) k/ a
    #1+ F) J& ~) N; f& s% k; |
    #展示数据集的结构+ p0 a# }# j  |1 _3 U# X
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")0 j" d' t' \) G
    str(data2) #显示的结果有一列是多余的,需要删除
    ( v9 S# {. T2 [& x4 _8 W0 rdata2 <- data2[,1:9]4 I+ j2 L4 i- _* a
    str(data2) #删完之后的显示效果是正常的没有多余列" J1 x: \7 K' [
    8 v! p# D' Y& g# q1 X0 f
    #2
    " s, o9 y6 s7 L0 @( `; n& n2 z3 q#显示前10条数据记录- E0 O! d# Q+ K# n) K9 }$ t: W
    data2[1:10,]" t; N( i) I4 H) _# w
    : ]9 `8 P; m( g, K( d4 Q
    #3
    9 U: N* e& z- U$ F) F#将变量名重新命名为英文变量名  s: K2 q  i2 V; `; K% Z! Y
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")& y4 \* g' p- j- ?/ U
    colnames(data2) <- cnames
    8 ^+ O: M' \2 R4 P$ KView(data2)
      I# E" @: x) Y2 u5 V3 P: S& ?
    & a) H( g& M* T2 F#4
    0 r8 X& r% q! Q) S3 P# C4 c#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录6 ^6 K  W# f# ?$ A. Q
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))9 r4 l6 z/ F0 y* ?: t* u
    #View(x2) #①先算出居住时间
    7 m" C4 ^0 L6 \+ mdata3 <- cbind(data2,x2)
    ( _8 Z. @5 Q" R& P! g6 C#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条) z2 F2 v: c9 H
    list <- which(x2<=0)* S7 S9 I( n9 J+ C2 _
    data3 <- data3[-list,]
    2 |( F; L5 f+ v) u3 Y0 U$ pView(data3) #删除异常数据后是125条数据( Y$ T5 r  d: B' Y: V+ ~

    / w* t  \+ ^0 i. B7 p  k#5
    7 K: Q- T& C$ y% Y- K$ k0 f4 P( ~#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。3 M7 u( G8 [  P
    library(lubridate): E7 ]9 ^! i+ @+ x5 B: Q
    date<-Sys.Date() #返回系统当前的时间  P7 {+ M9 }9 r
    nowyear<-year(date) #提取年份& _0 c% w2 n/ N( v1 _6 x
    nowmonth<-month(date)  #提取月份. e& g: z3 Z- Q$ p3 w# J
    #View(date) #查看现在的日期
    5 U2 i6 Q$ T- Z& R#View(month(date)) #查看现在日期中的月份0 \, Y9 B9 O  l* F
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))( N2 a. h' |9 X& x/ V8 y
    for(i in c(1:nrow(data3)) ){
    ) R; M1 z" ?- p* [  t, P0 f1 R- f  if(nowmonth-data3[i,"birthmonth"]<0){
    7 [/ x, S# }+ D8 u: o) v! q  t     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    3 y4 k& @* r2 I- ^) }  }else{
    8 i' d0 r6 A! d. `     x1[i,1] <- nowyear-data3[i,"birthyear"]
    : x- `3 q3 O. _9 q) f$ N  }) n+ R& p% P6 D
    }
    : W/ l2 ]3 H6 ^# ?- X  M#View(x1) #算出年龄x1,并加入到数据表中
      E0 t3 k* a/ @  P/ d6 s- mdata4 <- cbind(data3,x1)
    / Y. j# S' W/ @  r8 lView(data4) #加入x1年龄变量的新表展示" _$ b( f! F% X3 O  @$ n4 l* G
    x2 <- data4$x2
    + @* a7 ?( w- {# z( e( h# X" {) JMean.x2 <- round(mean(x2),2)
    / G+ ~4 _, c$ L* g$ ]Min.x2 <- round(min(x2),2)
    2 R2 S2 w& U7 D* b# y6 oMax.x2 <- round(max(x2),2)- w! e5 r. s8 W9 C5 _" t
    Median.x2 <- round(median(x2),2): `* b3 k3 q$ y+ i$ D
    Sd.x2 <- round(sd(x2),2)
    0 h6 M- v) E1 w) wcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果; c) |: C3 S: u. s" K
    Mean.x1 <- round(mean(x1),2)
    - T: i; W0 O7 R! yMin.x1 <- round(min(x1),2)$ x- M1 Z$ T3 E+ o& H) U
    Max.x1 <- round(max(x1),2)9 Z4 }/ |5 R& q
    Median.x1 <- round(median(x1),2)& P; ^2 d: X9 i% H  j3 k
    Sd.x1 <- round(sd(x1),2)( J' r& F1 ^. V9 S" h, Q, ]
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果3 z+ k/ ]: R2 m8 u: `, Z
    x3 <- data4$friends
    ! H1 _8 q7 F# x( I  i3 L  WMean.x3 <- round(mean(x3),2)- W  L+ J3 {$ v! F, U
    Min.x3 <- round(min(x3),2). o& a$ z8 }4 O6 M& t# f: e( P
    Max.x3 <- round(max(x3),2)
    3 F0 i8 W) A3 O: JMedian.x3 <- round(median(x3),2)
    ' X: ?* \- f- G0 PSd.x3 <- round(sd(x3),2)4 S/ W; D. I: ?+ j! |4 \
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    3 @, `! S# G2 k/ f& j2 ^; Qy <- data4$salary4 u( a3 i: I" r3 \. T
    Mean.y <- round(mean(y),2)
    ( R4 F+ J1 q$ F+ p  |* K, _Min.y <- round(min(y),2)
    ( h" j* i5 {4 }3 \8 T, P+ SMax.y <- round(max(y),2)
    " J" _  z- S" f+ T' fMedian.y <- round(median(y),2)
    # V5 r; Q0 h% CSd.y <- round(sd(y),2)5 X6 D/ I, a7 ?) B9 {% L
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    3 ^( Q; O& n* V3 O$ W: ?1 d  W0 {* Z- \0 H+ C2 X+ |; W# t  Q
    #6
    6 b/ O& n! H2 F$ k#计算数据集中因变量和自变量的相关系数,要求保留2位小数。, t; X5 a, x' F5 M  g0 h
    round(cor(y,x1),2) #y和x1年龄1 Z( ^3 `+ D. m5 x
    round(cor(y,x2),2) #y和x2居住时间) {. W, @! y/ G8 i% Y! X2 w9 J8 H
    round(cor(y,x3),2) #y和x3朋友数量
    ( _1 u+ |, j  R7 x6 o. v6 Y; H
    ) N3 b/ M! Z; Q* u) }#7
    ) G5 F) i( @7 m  s9 R' c7 E#分别绘制数据集中因变量与各个自变量的散点图
    ! l* e4 ~0 g! `1 G& }par(mfrow=c(1,3)) #布局,一行画3个图
    . X- q+ C* u" B* qplot(x1,y,xlab="年龄x1",ylab="工资y")
    - _$ T4 h: Q- ?2 nplot(x2,y,xlab="居住时间x2",ylab="工资y")
    ' g, K+ W6 j7 l+ o& |* @3 ~plot(x3,y,xlab="朋友数量x3",ylab="工资y")9 t5 j3 ]9 r3 _6 \/ }( V, A" c
    2 w" G0 J" a5 l2 e
    #8" p7 l0 D$ m6 {3 r9 Z/ l
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。$ M5 N: o  i  y# @" @' [
    lm.xy <- lm(y~x1+x2+x3)
    3 n; {/ [) d' m4 S; @( A# w2 w: Dlm.xy
    $ I; o9 j# T  S) L% {9 b$ jsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    . \5 v4 F+ c5 i) u% W6 n
    ; _1 g" r: f# I1 Z- C7 i- G#9; i9 r4 U1 a& Q% [  g
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    " p4 v3 w. x3 A7 ^* ~$ Z+ d0 x5 r4 Npar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列& u+ ^$ F$ Z7 q( B! q  _
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    : V7 ]% x5 s0 |#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。; ?5 ^. K5 w/ x
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    % G5 q8 i5 v0 \  y# ]#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    & l; o" {$ l2 `! }% G& R7 @plot(lm)
      n1 J9 z4 l9 ?" C1 Z  jlibrary(carData)8 v3 @8 Y$ p- m# q9 @' F& M# N
    library(car)
    7 _3 H4 j+ U. q3 I1 v9 M% coutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    9 R( H) Q5 W2 ^5 S. ^) ?" d0 C/ b! k
    #10- S5 v% H/ w8 m  m' O
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    2 n% @5 B5 C9 Edata4 <- data4[-136,] #删除该点* }3 H6 d! }( b6 x
    x1 <- data4$x1
    & b% G6 l& S# ?& [x2 <- data4$x2
    - f& k3 U& N" v) fx3 <- data4$friends
    & S, a' D6 V' wy <- data4$salary
    5 T: R! H" O5 |4 `/ S3 c0 n* ]" m# hlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型' s& S' m& `6 {# M: U
    lm.xy2
    " t6 c2 ?0 j- }/ ~" f# ~1 d5 V
    : G& M9 k. K1 b; ?0 b9 h+ P#11
    ( r- h$ p1 B8 Y; _+ W5 }' z! ^#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。5 a& [) p/ s, k1 S( N
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    + u: X- y' ]' K* c1 ]" z) X9 x) y
    , W9 \: J2 B9 A$ a8 a: G& t#12; a% @5 B" s' b5 J' g4 K2 R
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    ' f% l) [4 {, _0 Z2 b7 v' D; @summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星8 x3 i/ e+ e# A% S) z( i. |1 Z
    4 {" W2 h- I! R, B, F( M) `
    **********************************************************************
    $ H* u4 E9 _9 w) v
    : p( S% f+ l7 z6 x& H二、利用多元线性回归模型预测收入
    % X5 t8 |. c& xView(data4) #124条数据( I  O7 Q+ G4 R5 X0 O8 a' D
    #1
    , `# ?3 M2 h! u( O2 d8 M#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。& }' a% ~7 K8 ]8 y0 R  p
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集; h$ O2 L8 E) `4 Q" x
    trainData <- data4[train0,] #训练数据
    5 l6 K7 Y# F9 ~6 \; t  stestData <- data4[-train0,] #测试数据
    ) W2 K2 P) M  g- \7 t. O7 N- _$ W& h
    #21 t+ G1 D; |: c+ d3 n2 M
    #针对训练集,利用多元线性回归模型拟合数据。0 ]; f  |0 j, [$ ^; R# V9 k
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    9 P% D+ p1 {/ r5 J1 k* T% t. V' Z/ |# k$ d, M- J0 Z2 B3 @
    #3
    & ]0 d9 m: x+ R#对(2)中的多元线性回归模型进行诊断,处理异常值。
    , p" u& Q7 n) G1 Q' dsummary(lm.xy3)+ K& H+ B) j& T( i" @, n. x; Q
    par(mfrow=c(2,2))
    4 V6 _; t% i3 U/ c! @plot(lm.xy3)7 }1 a7 S& z; R9 C- I3 f
    outlierTest(lm.xy3)
    , r& p+ c2 j! M1 m4 `1 xtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的2 d* K( ^, g) _# Q; S, y+ ^4 |
    ) w7 \# ]  S: l5 i, _: X
    #4
    6 Q/ _) [" a. _; y% L& U0 k5 ~#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    + \8 i2 l1 l& @% ~+ Uvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)6 t% [$ V: \9 [
    salary<-trainData[,"salary"] #引入的数据是训练集的数据4 }0 v/ G! L8 J, S) f
    x2<-trainData[,"x2"]
    # H+ E' A) ?% o; a! k9 Cx1<-trainData[,"x1"]. c4 i( K9 y( y& M
    friends<-trainData[,"friends"]  t+ Z: p( d, K
    lm.xy3 <-lm(salary~x2+x1+friends)
    ( }& T% s2 t! B  R) R7 B9 m% f. V$ ?% _; O" U7 X1 r. y
    #5
    % i0 P5 E; T. v1 I+ T" X9 `#针对(4)中的模型,分别利用AIC和BIC选择最优模型。; f4 h8 `; e7 }' e! G
    #AIC检验,赤池信息准则,选择最小的8 D7 l- Y( L  `
    AIClm<-step(lm.xy3,direction="both")
    * H$ P: O! ]5 R- k0 g6 F- m#BIC检验,贝叶斯信息准则,选择最小的& D7 @* ^$ e+ q% h3 b- _$ B  c
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ; @- z& H* D" U4 @" w% Q, [/ V+ q5 c
    #65 M: I# h1 X0 ^
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    9 X0 u% w% }  G4 n% t1 g8 v3 ~#这三个模型预测的准确性大小,并进行解释。1 y' G6 A8 Z9 j  A% N
    Allmodel<-predict(lm.xy3,testData)% a! f( |* f" V( N7 z$ ]
    AICmodel<-predict(AIClm,testData)
    6 U4 P& z, T% ^; e' e; iBICmodel<-predict(BIClm,testData)
    ) t6 \+ W5 Y0 ?9 n6 y  R6 H1 k5 `#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差: W/ t* b" d: v' o
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    4 a7 ~5 V; l/ x" P( u8 F#标准误差能够很好地反映出测量的精密度3 ^* O" R3 h. P, Q9 R
    MSE <- function(x){9 ^9 |- N) g1 Y: h, |
      mse <- sum((testData[,"salary"]-x)^2)/501 E+ f( V9 p8 R6 e4 Z  m( v; [
      return(mse)
    $ m5 O3 U" `( H}
    ' I  |( V1 |6 @1 g  |MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    # h$ ~# d7 j9 f) i) @+ fMSE(BICmodel)/ S0 Q% i3 Y% S
    MSE(Allmodel)
    $ W5 h( [4 M  U$ e8 J8 W: e" \  _8 L, w9 n9 f; y% M0 m
    7 |! U! d- i+ V( U; |
    $ ?# K, p9 g- e( P$ J
    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-7-22 23:38 , Processed in 0.323054 second(s), 55 queries .

    回顶部