QQ登录

只需要一步,快速开始

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

    一、背景3 Z1 [! d2 i- \) A9 F0 m# @3 q
    数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素
    . _2 ?5 |  n( \- v* U#1' X$ U" R: C! c8 L6 k( q! d
    #展示数据集的结构
    1 w; Q0 N& Z- o2 G+ d; z6 kdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=","); q  y4 {/ Y, x/ C8 j+ f3 W
    str(data2) #显示的结果有一列是多余的,需要删除
    7 a6 s5 F) N" w9 J- w3 N& t$ _data2 <- data2[,1:9]8 A. {! O4 O& U0 V: w2 Z8 \
    str(data2) #删完之后的显示效果是正常的没有多余列6 V4 s' s+ Y% |
    8 p% M% R! ^1 `& w9 P  h. v& m! m
    #2# V) v9 r7 e1 ]) `$ `0 b" |4 \4 z
    #显示前10条数据记录9 L* b1 E9 v4 e  |
    data2[1:10,]4 M- {  V+ W/ X; A8 m7 F5 ~

    + m8 m5 {& @8 |/ o+ I, a#3/ e" I: W# V$ J
    #将变量名重新命名为英文变量名
    / J- V) u9 A1 n9 Pcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")5 |9 p: Q$ ^2 `+ ?: i
    colnames(data2) <- cnames9 E1 d. H- C  J2 \5 ?) O5 `
    View(data2)0 N* i3 m5 B5 x3 I" d0 ]
    - g. d4 o  o% M  t/ P7 }1 N1 k
    #49 r; T. h0 k% r* P5 j; Y! J, N
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
      h/ X; M# b3 n8 P7 W6 G; z6 @! {x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    $ G2 o. B1 J" B  K9 e+ }#View(x2) #①先算出居住时间
    , ]5 X5 C% n: Idata3 <- cbind(data2,x2)
    - e- C6 [- c0 T( B2 u! W#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    . e2 q1 v# \$ F, e( wlist <- which(x2<=0)8 O$ \% V. z% H/ _1 d. C' b0 F
    data3 <- data3[-list,]
    ( `, W) R( I* ?0 W! gView(data3) #删除异常数据后是125条数据- B; H" k4 X, w9 X" E
    # X2 u$ p1 L, N9 E( y0 W  h
    #5
    $ q1 X/ i6 p5 X! a1 G#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    $ O8 e4 o$ z( P& A# W& Vlibrary(lubridate)' F$ P8 W: k$ ~- k
    date<-Sys.Date() #返回系统当前的时间3 c1 U9 z  M7 C- U) A: [3 W$ T9 y
    nowyear<-year(date) #提取年份
    3 f. S! G1 c0 q, Jnowmonth<-month(date)  #提取月份
    ! o# K- }. E+ \1 j5 W7 H7 v#View(date) #查看现在的日期
    # {5 q- t- A' f9 b6 T#View(month(date)) #查看现在日期中的月份2 S' Q# ^$ Y) r& D! P( A4 A
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))4 h, \* g2 V% M5 U5 B0 J
    for(i in c(1:nrow(data3)) ){* ~7 B# B. A0 U- I  [! p
      if(nowmonth-data3[i,"birthmonth"]<0){5 x- J- ?; X% x0 i( U
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1% x: j' k, F! y# g# ^& n0 \7 _
      }else{4 O% ^% o+ n) J9 L' k; I/ Z: N% w
         x1[i,1] <- nowyear-data3[i,"birthyear"]
    ' _! K" U' W; T- E  }) a! N$ I$ S: W# g! Y0 U& l$ m
    }- M) [+ N" a; S2 z
    #View(x1) #算出年龄x1,并加入到数据表中0 q$ K" H! Y4 a! [8 W. R* w
    data4 <- cbind(data3,x1)
    * ]' R+ e; w+ I0 ]7 \' Q7 c( SView(data4) #加入x1年龄变量的新表展示
    ( G5 @9 h' a' Q  {; x9 ]5 Q/ g5 _x2 <- data4$x2
    0 q4 o8 k) a4 c6 c, p; K" I7 NMean.x2 <- round(mean(x2),2)
    ! s" P  I5 h2 p( p0 WMin.x2 <- round(min(x2),2)
    / @/ s3 }+ R& b- G/ X& {Max.x2 <- round(max(x2),2)+ z% D; W. c5 z
    Median.x2 <- round(median(x2),2)
    3 P) d6 F8 [3 USd.x2 <- round(sd(x2),2)5 e+ I; ?6 D) F# J; `
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果& [# c- Z* G3 o; R9 }' m) ?  N
    Mean.x1 <- round(mean(x1),2)
    7 ]& G* b. ~; k; ~Min.x1 <- round(min(x1),2)
    - q2 d7 p7 P$ V* [4 MMax.x1 <- round(max(x1),2)* e# R- X3 U7 g. {, O) m/ W2 ?9 a
    Median.x1 <- round(median(x1),2)
    . M7 ^$ G4 G2 S+ r1 \3 u$ HSd.x1 <- round(sd(x1),2)
      e9 Q7 u4 Z0 C! F; v8 ]' tcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    ' N: E/ c5 M* r) p, bx3 <- data4$friends7 v5 m) c4 O" G" k* w
    Mean.x3 <- round(mean(x3),2)
    : @+ i7 p) @0 b& l: H8 GMin.x3 <- round(min(x3),2)
    9 ]' L: E6 G2 D- h) j5 a$ yMax.x3 <- round(max(x3),2)
    : _# v7 I) P" v( L' ZMedian.x3 <- round(median(x3),2)! {' D* }5 r6 e  p( m, {" v: b
    Sd.x3 <- round(sd(x3),2)
    ! O3 o  a8 B9 J- @5 k# C9 ^9 ^cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果( h; j/ C+ h9 {6 S* ^* J! ~6 J
    y <- data4$salary# V! W$ Z6 @8 F) G3 o  M( ]
    Mean.y <- round(mean(y),2)
    # [( H( f  b6 R7 a; B  |+ |Min.y <- round(min(y),2)# E5 H' F7 ]: Z! B
    Max.y <- round(max(y),2)8 V; t9 ~  m+ C
    Median.y <- round(median(y),2)7 T8 `- b# s1 i. y( p
    Sd.y <- round(sd(y),2)4 K% g" h; E/ O8 a' U* y5 F
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果; E4 E5 ^9 N! H* b0 V

    0 ^3 l% [1 q" ?8 ]9 Z#6
    , B4 D' D" x9 o# ]7 L#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    & i# {; j! ^) Kround(cor(y,x1),2) #y和x1年龄+ z+ @- J7 i- e; L$ x. l
    round(cor(y,x2),2) #y和x2居住时间
      x1 A5 m$ j- p) X4 O: jround(cor(y,x3),2) #y和x3朋友数量
    + U, _/ @" @; @5 g) i) A- P. P* D, K2 i$ ?( ?& R
    #7' v5 o4 n) h1 S9 W, u$ {8 |" ]
    #分别绘制数据集中因变量与各个自变量的散点图
    * T7 q) i% U, H1 `par(mfrow=c(1,3)) #布局,一行画3个图& A2 b/ ?3 _2 [8 |% l7 s
    plot(x1,y,xlab="年龄x1",ylab="工资y")( b$ \2 W6 D0 t( f, \; a
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    8 V2 _6 P3 ?. R$ E$ x! dplot(x3,y,xlab="朋友数量x3",ylab="工资y")
    2 i) A2 A9 }7 k+ N, r( ?. l
    0 F, h7 \8 ~& k1 D0 A) Z#8
      ]# c1 p4 k# M$ w: S0 E' ~5 m$ c#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。) h% G! }3 x7 g* ^% F
    lm.xy <- lm(y~x1+x2+x3)5 m# ?) E: N5 `( [( D
    lm.xy
    $ x7 o9 G5 i" y$ K% W, h) `7 tsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    + r& k( |; v' d: M/ p0 a% h
    - o$ z' [1 |: P0 V; o#9# G3 j: J7 y& r! H% C! `) Q2 Z
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    , ^) H6 [/ \0 U& e. F! ?, npar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列; K3 T, g# b, `
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    2 u% `2 Q, z$ }4 d0 |#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。* p' S2 _5 t9 Y- g6 F
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    1 D1 E, o- q3 m' H#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。: c' ~, a0 k4 K$ K) r
    plot(lm)2 n9 J0 i& l: f$ ]) C
    library(carData)
    # s4 T+ l: J3 d8 Flibrary(car)4 E' S/ V: w% ^( ~; m5 L9 P( q1 N
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点6 \. H% W- Q6 g1 N  e

    2 i5 O! I: ]8 g5 u& S, n8 W#10( {5 H, A1 r; }+ f
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    4 p# j7 K( Q0 D( `5 Adata4 <- data4[-136,] #删除该点
    * z' Q4 M6 [: X& a' j1 rx1 <- data4$x1
    * j* t) C! u( r7 l% Yx2 <- data4$x2
    ; r! {$ O- z3 F4 J" S( ?5 u' Tx3 <- data4$friends
    ; ^. W  f, I& Ny <- data4$salary2 L# d7 l0 R0 n$ A9 l. A0 ]( O
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    ( e# V# I1 `* Slm.xy28 z" |; A4 H* g

    1 k0 U' G+ E9 g1 ^6 q2 a% }#11( y+ G' I' v5 L5 ~  k# `; w
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ' r/ s) _" ^9 j2 m5 n/ Jvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    # b4 D% {; p) g  X% X1 H1 n7 V6 D8 S+ \" s2 o
    #12; x4 z4 l/ y" e
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。! r" I8 H+ K8 m" x: m
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    8 T, J6 ~1 ?8 u% o/ S8 e
    - f" j: @. d6 u! \1 E**********************************************************************0 [& j1 x4 ]" k- `+ C3 j6 f
    % i5 T( g# O8 i8 e
    二、利用多元线性回归模型预测收入5 E2 j2 p! Z7 Z3 O& W3 \
    View(data4) #124条数据
    * z' k+ [: ^( [) l#1
    ) b' g) ~0 k2 d# N#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    * r- H7 h2 s, a/ d7 D/ V& ytrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集+ ]) K  _& @8 e2 ]  ~
    trainData <- data4[train0,] #训练数据
    * J6 r/ B  @: O: etestData <- data4[-train0,] #测试数据+ J0 d+ Y  l6 H( v* t7 P+ G9 ^

    2 Z% ^2 f" w; i#2
    ! g6 H. O* d; c+ _8 w#针对训练集,利用多元线性回归模型拟合数据。
    4 a8 h$ Y' y3 B' N; Blm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])+ G8 s5 p9 i( G
    : f6 n8 G9 T1 M+ M& l8 B
    #3
    . S3 s# `" ?: G#对(2)中的多元线性回归模型进行诊断,处理异常值。
    + r1 m. J) `! k. Zsummary(lm.xy3)9 q: h+ H/ g- d1 ?5 T$ N
    par(mfrow=c(2,2))
    9 K- b3 N$ m% ~0 e# y, k4 rplot(lm.xy3)0 k+ s: U& Y4 i# a" t
    outlierTest(lm.xy3)
    0 P- E. A, f! o8 A( w5 ?trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    # Y  i' P, O" d+ N8 R/ w, X  b. D2 g# Y
    #4
    ) O! x  ]# y# z0 ]6 W#对(3)中的多元线性模型进行多重共线性检验并加以处理。8 W! [- Y. v+ c) x- O! E, w
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    0 p* Z3 U- [- dsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    3 n! J' O# _% P, ?x2<-trainData[,"x2"]
    : {3 ^4 V0 m" hx1<-trainData[,"x1"]
    # s' s* m5 c; l3 kfriends<-trainData[,"friends"]
    # C/ m2 R) O0 T; ?$ ^$ W$ |lm.xy3 <-lm(salary~x2+x1+friends)
    . a! M. G9 W/ _8 w& N3 L5 C* w: n) n5 B7 A4 v
    #5) P3 C, \- G  b4 k/ m2 X1 T! i6 e
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。6 Y4 `! w  ~( w) t! M% }
    #AIC检验,赤池信息准则,选择最小的
    2 e/ G4 V5 o; X7 f: c, k' UAIClm<-step(lm.xy3,direction="both")
    ; h" d$ }9 C1 R9 \: l- P#BIC检验,贝叶斯信息准则,选择最小的
    0 d9 ]$ D- p4 k. JBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")) n0 \! m& P& e
    , j* G" @$ |  i/ Q7 a: M. G
    #6
    % c& |; i+ w/ v0 W' @$ Z2 ]% `#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型8 o0 g, b: ~. b: m) n, ~5 b
    #这三个模型预测的准确性大小,并进行解释。
    1 C! i1 A( I: m4 j* c3 B3 c% B6 CAllmodel<-predict(lm.xy3,testData)
    " d  f2 [' T! Y! QAICmodel<-predict(AIClm,testData)2 H7 {$ p( f- B& ?8 ^
    BICmodel<-predict(BIClm,testData)
    : O' ?) U4 A. W- ^#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    # K: i' X  O" ]8 h#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根* u( }2 @. z; W- F+ _( ^0 B" L
    #标准误差能够很好地反映出测量的精密度
    ; l! j& f, U- e/ ~# TMSE <- function(x){$ L( D0 u. \$ W" ?; x
      mse <- sum((testData[,"salary"]-x)^2)/50" c$ ~* c& v9 X' ^
      return(mse)
    8 C0 R. N* L. ~6 R; d* [}
    4 X2 t; ]4 ]( z5 s. H& YMSE(AICmodel) #AIC/BIC/ALL是误差最小的. I" l) m8 `$ d& z7 t
    MSE(BICmodel)0 P4 |6 D- u, N$ w" Y
    MSE(Allmodel)
    : {' Z& l, Y" D" H+ C
    ; K# @" ?6 X: s; ?+ H1 m
    / V2 Z1 @, {) A. E6 L& U! A1 V
    . b$ ~; v4 ~5 [
    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-21 08:15 , Processed in 0.433053 second(s), 56 queries .

    回顶部