QQ登录

只需要一步,快速开始

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

    一、背景( Q7 z2 x/ e9 ~, g) G
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素. w* d, U+ U$ `8 r) S
    #1! m) V: m0 }9 z, _2 [
    #展示数据集的结构: q) b1 V+ q7 z- P3 M) O
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")9 `' z# z8 ?. j# G' a- p
    str(data2) #显示的结果有一列是多余的,需要删除
    6 \+ y( b  c$ Z' F% h! B$ cdata2 <- data2[,1:9]
    ! p) D( p7 Z# y2 O; E/ ]* r4 jstr(data2) #删完之后的显示效果是正常的没有多余列0 b# S9 ^( O5 N) }* ]( g

    % t8 G4 P8 z) ?5 t: N#2' N6 _% Q, z. M! y* S/ c4 y8 S
    #显示前10条数据记录2 V9 S0 E2 _; u1 Z/ g% X
    data2[1:10,]
    + f4 X$ \0 ~2 C+ Q
    ! I% B, {1 n2 m2 c) Q) n- ]#37 A7 O( ^# w) w) Q' ?/ g- t
    #将变量名重新命名为英文变量名
    4 G0 W9 F- q; g# D8 X8 p. v& j9 ycnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    , t2 ^  m# a) X3 icolnames(data2) <- cnames5 p" q/ D& k" Z) w! _! p
    View(data2)
    ' e- [1 U6 ]* f& b6 ^$ O1 N/ W& g" F/ B# K
    ) c1 m1 N% ]8 m; f#4
    ) R- u* I% ?0 j# o#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    5 V7 ]* V) J( o' cx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    " j  H  |) Z4 S) T: O: N#View(x2) #①先算出居住时间% G3 n5 ^0 R& ?
    data3 <- cbind(data2,x2)
      D# v  C# _/ q, ^5 V#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    % }' z7 F, F9 _8 W$ {list <- which(x2<=0)
    + k+ ]: @: G5 A: `8 R" Vdata3 <- data3[-list,]
    3 K; ]# |/ a) k1 |View(data3) #删除异常数据后是125条数据6 @+ x& ~# W2 u" h" M

    * N& n; m% D; P, I% f. K#5; _3 l* Z% f: H
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。8 O- s  S; J: E  n" P& r
    library(lubridate)& z4 z. o: U0 _8 D
    date<-Sys.Date() #返回系统当前的时间
    + A$ l% h6 r' ?5 cnowyear<-year(date) #提取年份
    ) D* T% m, B! F+ k& l* c2 o7 znowmonth<-month(date)  #提取月份" U) `9 s% g5 W4 F4 m6 j
    #View(date) #查看现在的日期7 q+ m3 F& e8 @4 T
    #View(month(date)) #查看现在日期中的月份
    ( B+ ?+ f* a2 O; t# E; k  I: zx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    - ?* G3 b# N% W  m8 U1 \4 h/ |% Ofor(i in c(1:nrow(data3)) ){
    4 h0 I6 E7 S3 v7 L0 x  if(nowmonth-data3[i,"birthmonth"]<0){. L' @5 ]( @5 p3 L; s
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    2 I( W3 X4 g* S5 Z. M# ~  }else{
    ( p$ Y0 K' D, Z- d7 {* ]: A     x1[i,1] <- nowyear-data3[i,"birthyear"]) o7 m. Z+ |8 d8 n/ m7 B- m* K
      }+ v) P" A: p" q  I- _. {% g
    }3 }- @) m! D5 ]0 W( Z6 P5 J$ Q1 Q
    #View(x1) #算出年龄x1,并加入到数据表中0 ^0 P( q" M6 p; p% L+ d: i' G
    data4 <- cbind(data3,x1)
    " b% q; H/ E) L; SView(data4) #加入x1年龄变量的新表展示
    1 q3 `' o; b6 d% l% W. F! Bx2 <- data4$x2$ @  m. \, X; v
    Mean.x2 <- round(mean(x2),2)3 I) S5 W9 E/ c7 L' a
    Min.x2 <- round(min(x2),2)
    ! t& x4 y0 |6 d; n- kMax.x2 <- round(max(x2),2)
    ; s7 E+ q$ b- d4 s3 b' Q- X  f9 g) TMedian.x2 <- round(median(x2),2)8 `- ?% l/ E4 e& M' [9 t3 y/ x
    Sd.x2 <- round(sd(x2),2)
    3 {/ g1 P" O! C2 i  D* d; ~cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    ! [* W3 |$ b0 y$ X* |Mean.x1 <- round(mean(x1),2)
    9 Q! ]0 I6 Q7 z' O) VMin.x1 <- round(min(x1),2)8 ~7 c2 K) F$ O6 ]
    Max.x1 <- round(max(x1),2)- W4 G, I6 s: S9 N7 U* ^9 ^6 e
    Median.x1 <- round(median(x1),2)  R4 L) X6 t4 F7 ^' J0 P
    Sd.x1 <- round(sd(x1),2)
    , [; A$ s% K5 c! ?' b0 o% q( Lcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果+ J6 i: V( h- L
    x3 <- data4$friends
    + ~7 l. g; h6 w* ?) SMean.x3 <- round(mean(x3),2)
    3 H0 u5 @9 Y7 C5 W" |& MMin.x3 <- round(min(x3),2)
    6 @% q% M% j" k. {+ K1 IMax.x3 <- round(max(x3),2)
    ! R* C/ N! ?$ nMedian.x3 <- round(median(x3),2)2 p! D; w/ k2 _
    Sd.x3 <- round(sd(x3),2)0 p! U" v% I6 _- t; ~. q
    cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果  j+ M/ U" G7 s. }
    y <- data4$salary
    ( B( q: k4 O7 e3 K! EMean.y <- round(mean(y),2)' Z2 B( }9 k3 _2 X3 B6 \* Y
    Min.y <- round(min(y),2)
    $ q/ s) j7 m2 d4 }! BMax.y <- round(max(y),2)
    & p1 v  n8 s" n7 a) [% J0 \3 g5 aMedian.y <- round(median(y),2)
    $ [3 m- {: @1 s7 qSd.y <- round(sd(y),2)
    1 k6 b9 f4 I/ h% O$ Bcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果5 }+ y$ V9 k& T2 O: `8 V, t  X7 Y
    ( P6 G' \  B$ ~
    #6  i  O9 |8 s6 N- T1 S
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    9 N3 L; h' B' u: ~. t! O/ `round(cor(y,x1),2) #y和x1年龄5 y4 `# w6 q% ^3 A& ^
    round(cor(y,x2),2) #y和x2居住时间, L# e  x) c1 e+ g% Q: N& b9 u
    round(cor(y,x3),2) #y和x3朋友数量
      Y* X6 o+ d+ I
    " O% b: h4 }) V4 n7 `5 u7 w#7
    2 Y6 Y$ f! M/ k% V3 I5 s' f#分别绘制数据集中因变量与各个自变量的散点图3 I: i# M: C  r7 e/ r  Z3 G) U
    par(mfrow=c(1,3)) #布局,一行画3个图, m' m- |7 I. Q% ~
    plot(x1,y,xlab="年龄x1",ylab="工资y")& L6 R+ ]5 g- t$ [% j9 |
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    7 [; K! V7 _+ z+ @. Gplot(x3,y,xlab="朋友数量x3",ylab="工资y"): R) B5 j  g- d) @) H2 ?) V" l

    1 Z# d  Q# I( p#8
    ; z  J, A+ p8 \% @7 \#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。8 C6 X" d, x( o, x/ C
    lm.xy <- lm(y~x1+x2+x3)( ^6 ?* h" Q' z. U+ H
    lm.xy: r: M" X# T9 X$ A. D; ~& c. f
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    5 c( ?" v6 b' i
    ( [+ F& V5 F' q# S6 |6 @8 w; K#9
    9 E  q  ]4 R2 i( o) D8 W#对#8中的多元线性回归模型进行诊断,确定异常值记录。  x, X3 h; b" c! e  c
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列/ }6 G0 W# |% s+ h4 n  C/ e7 [
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    9 _( w( I: @1 \, c2 p# ^, q#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。( l) Z. o" K7 G9 i2 v
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    / I: {( @, Z" ~$ I4 M' U4 c#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    / k/ U2 v* {( A/ g3 Eplot(lm)2 c5 i6 X3 r. {5 I
    library(carData)
    : ^1 N7 n9 O4 V" ~/ u: Klibrary(car)
    ( W% @, K" E5 r% B, p4 moutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    8 o8 c  h7 D4 U2 ]; G/ N( U
    $ l: n1 O/ J! G0 Y3 [% Y#10
    3 f% x9 A& e' T- o1 |8 k: |#删除异常值记录后重新利用多元线性回归模型拟合数据。
    1 I4 \) x" q& M* C, vdata4 <- data4[-136,] #删除该点
    8 |- E, Q5 c. Mx1 <- data4$x1
    2 ?0 ~; E5 _0 l7 L' L$ C9 T* U" kx2 <- data4$x26 ^: h( Q& X- G) ^
    x3 <- data4$friends0 l( m% S( T% A: d& t% b2 x% p% {' y
    y <- data4$salary
    1 a# {3 M+ h: M0 u: i- Z* Alm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型  s# j8 s+ u% R3 S
    lm.xy2
    " S! V0 R% P* ?) @2 D/ e3 x7 o$ ^, Y
    . {. U- I2 t% @. A! I#11# F" o9 Q" v; B4 \, Y* N" Y. P
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ) e. M4 A2 p8 }' @! @0 t9 bvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    ' _6 O2 C1 F. e$ F7 x
    8 R; t* C, B" n! f: ~* E3 c#12
    1 l  g2 Y8 `) `) {. y4 L#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    . T$ x6 a8 b3 S8 w1 J) d0 R! osummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    7 A& x7 J4 d  k$ O- V% q. l* q1 Q* z# r! l* ^9 @0 `
    **********************************************************************$ e; t8 I: W  j/ x

    4 J; J4 a8 R: j* m" j二、利用多元线性回归模型预测收入! C# m& x8 D" L8 j
    View(data4) #124条数据
      w$ b6 [, Q3 s& G+ G#1
    2 k6 |7 `8 b" T. t+ c7 j: e#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。) i( e( j% k2 h- j) n
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    6 J/ [7 q( q6 W1 [; _5 KtrainData <- data4[train0,] #训练数据
    + I* F9 \4 z( J- MtestData <- data4[-train0,] #测试数据0 ~8 L4 y4 B# U4 z; }( _

    : |3 n& \9 u) }9 r#2
    # I: X1 y+ }2 L#针对训练集,利用多元线性回归模型拟合数据。1 t& b3 I$ T6 T" {% c
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])5 [, v1 m, p7 E: l- A" `0 [

    + |4 k. c7 s" z! Q4 J" h#3
    ; j% k# X5 A+ a+ c6 h3 k#对(2)中的多元线性回归模型进行诊断,处理异常值。
    0 I, j5 ^; i7 l* h  }* H( c6 [summary(lm.xy3)
    ! }  o6 L# u" y/ ?; i6 R, d" ]( ]par(mfrow=c(2,2))
    4 ^+ B5 f0 a3 h0 D0 l2 j3 T2 i( D5 p# H/ Lplot(lm.xy3)
    / ^3 D9 x7 b$ U* @- g7 O- RoutlierTest(lm.xy3)
    & L" j/ T0 ?0 e+ h" I8 WtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    ! j/ x4 F; i6 {3 G0 V1 l6 X( R4 Z  L5 T
    #41 Y; |  }6 t/ _  i4 u
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。9 S; A( I. k1 w# z% J. g
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)# @$ d) M2 `% r. O, E# a
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    8 u: N4 x9 l3 ]+ Kx2<-trainData[,"x2"]
    1 D1 d8 V2 T! R3 d& c' A: ex1<-trainData[,"x1"]# y3 n% G+ c# D% e! T! F, @
    friends<-trainData[,"friends"]2 O6 `6 L) p! u) G  U+ w9 J
    lm.xy3 <-lm(salary~x2+x1+friends)$ r; ^, E& J9 w6 R* a- J6 Z
    5 G5 k/ A- ~, W  K
    #5
    8 S$ k8 x1 i* r) V#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    $ }  |- a# C' {5 w' u" @#AIC检验,赤池信息准则,选择最小的* o4 R+ t- @! E2 p4 I- @! F0 v
    AIClm<-step(lm.xy3,direction="both")  U5 ~. G# U% ?, X
    #BIC检验,贝叶斯信息准则,选择最小的
    5 a, `9 p' n/ \- k; t& X  YBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")( w1 H+ \7 n: A/ q9 w# h3 V2 T1 u
    , p9 f2 P$ d8 O" d
    #6
    : n! |1 }7 D+ o#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    . }. [4 \+ j2 L#这三个模型预测的准确性大小,并进行解释。
    2 d( m7 \9 o0 \' g+ c" qAllmodel<-predict(lm.xy3,testData)
    % [8 a, s! g: C% m* dAICmodel<-predict(AIClm,testData)
    ' a" s) A" C* v0 ?BICmodel<-predict(BIClm,testData)
      u+ R" R+ Q8 ~" D* ~  |0 m  V#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    ) G! g: T0 J( P* v% _#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根) }* h9 d; Z# e4 e, c
    #标准误差能够很好地反映出测量的精密度
    . ?2 e0 j" K- K6 l% [3 b$ bMSE <- function(x){
    , M% l# J. j8 h7 Z  mse <- sum((testData[,"salary"]-x)^2)/50
    ) R6 \+ q0 R$ k! j% }6 C1 r% A& {  return(mse)6 ^- C) n: ^9 P: D+ M* {
    }8 P4 r: V: j* m# @; t  q4 e% Y
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的5 h# r3 k3 ?4 P4 F
    MSE(BICmodel)4 U, N, s' j& h, v. i
    MSE(Allmodel)
    * s7 Q9 f8 t8 i7 o; l5 V6 P( y
    ; ?5 ]9 m8 S) L6 t+ R% O& K& r. h- |) d9 n

    * c1 w. U/ m' W8 W1 N# v
    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 01:13 , Processed in 0.424476 second(s), 56 queries .

    回顶部