QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    ' b0 i. X8 O  p1 t& J1 \, I* W#1/ d$ u2 r6 ]/ q( B0 o
    #展示数据集的结构
    , N$ H  l9 @. O" I! l# J3 odata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")9 |5 `6 K2 K) F3 u1 d$ N9 h# f8 Y
    str(data2) #显示的结果有一列是多余的,需要删除
    5 h# q% U8 {. {8 l2 @$ I5 f: {data2 <- data2[,1:9]
    / k' L- F* g5 w8 I/ s/ rstr(data2) #删完之后的显示效果是正常的没有多余列
    9 H- M( b: ~. e9 z; Q1 }
    - O" ^, J  E  Z" ]' e1 l( Y#2+ d/ d- M1 S3 X9 I
    #显示前10条数据记录
    1 m8 h8 `  \2 r5 H5 Jdata2[1:10,]7 u$ Y8 {# P* b$ \! w7 R

    % P! {; E7 e& p- @% `- o/ ]' Y* B#3
    ! Y8 q7 O8 V* c#将变量名重新命名为英文变量名0 y, [2 M6 Y: R/ ~' ~  {
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")4 g, X) E& \) L- I
    colnames(data2) <- cnames5 ]6 n7 Q* o9 l& V
    View(data2)( R+ R; Y; `0 Q8 l0 z
    0 w, V9 \- y9 o$ M$ W! q
    #4, N% m2 L# u2 O
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    4 d6 Z2 O# @& R0 ^0 q3 {" [x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth)). X* d) [; Y9 Z5 \) }' O0 a# \
    #View(x2) #①先算出居住时间' k, R/ g) A/ P* Q  r: r, E
    data3 <- cbind(data2,x2)2 m9 f1 c/ b; P2 o4 T# n7 z% h: `
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    ' C5 |  @/ y% _- t4 Hlist <- which(x2<=0)
    0 j6 b" {( j- I" [3 l- r. K6 ]data3 <- data3[-list,]
    ' Q8 [: o1 I) S+ [0 J5 CView(data3) #删除异常数据后是125条数据
    ; Y2 ~; R+ J( T9 g; J" K  h
    8 M; G7 B; q, E0 I$ f0 q#5
      j6 E6 C- l/ w8 k0 ?% a1 u, P$ L% |#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。/ v3 d' I8 }& e
    library(lubridate)
    $ e; T  E6 M4 ~$ _* {1 t. Z! Ldate<-Sys.Date() #返回系统当前的时间
    % d/ e7 z$ v7 v$ `2 U5 m4 tnowyear<-year(date) #提取年份2 B9 y- u% N- Z; d. O
    nowmonth<-month(date)  #提取月份/ o' C" H) C' r! D' r
    #View(date) #查看现在的日期9 |; ]/ V7 Y- H7 N
    #View(month(date)) #查看现在日期中的月份0 N9 m0 T. H6 G& E- P4 m$ g
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))$ Z. A3 B$ V8 z1 ^/ `8 [
    for(i in c(1:nrow(data3)) ){
    ' D$ \, N* q( k; ]. D  if(nowmonth-data3[i,"birthmonth"]<0){
    * q' b4 |: V6 Z, g6 b/ ~6 I6 l     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    1 {* N. D/ M3 q  }else{
    ( V3 p7 V2 ?( a2 r! O: Y3 W5 x     x1[i,1] <- nowyear-data3[i,"birthyear"]$ Q3 Q; d  f" O2 j) Y# b
      }; ]7 {) E. N3 D) Y7 H
    }
    ; y* m( S1 L$ G" s3 b#View(x1) #算出年龄x1,并加入到数据表中! T# `0 x  D: L1 o
    data4 <- cbind(data3,x1) , ~3 {  D- h8 {* c, r3 ^! r: o+ N
    View(data4) #加入x1年龄变量的新表展示6 s9 w4 V8 p; q* q
    x2 <- data4$x2
    & m) i! U) E7 c% }2 {7 E, TMean.x2 <- round(mean(x2),2)- R3 c, l% F% B$ U% ^% @; k- H2 r$ c
    Min.x2 <- round(min(x2),2); O  e" x* Q4 z; o) C
    Max.x2 <- round(max(x2),2)
    7 S6 Y. c: b) E" A/ Q) p8 c0 eMedian.x2 <- round(median(x2),2)% [# g! o& I1 G4 h) q; f% d" w
    Sd.x2 <- round(sd(x2),2)2 h$ q9 R, r  E. n
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果' N- y5 A. f1 s; q/ X+ J/ y4 E
    Mean.x1 <- round(mean(x1),2); m$ c& A! @( x) a$ O/ v
    Min.x1 <- round(min(x1),2)
    + h7 t2 {$ V8 p3 _0 u6 @1 [* ]Max.x1 <- round(max(x1),2)
    / r. w# ]# C, \1 W# p, M) AMedian.x1 <- round(median(x1),2)+ U& p" R$ X1 I- S6 B% i8 S
    Sd.x1 <- round(sd(x1),2)2 y1 r# y* F5 w- L- E
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    , ?( l: {9 `* n) q8 C2 |+ dx3 <- data4$friends/ [2 O7 I% Q4 Y. W. L5 ^" n
    Mean.x3 <- round(mean(x3),2)- I; m$ C" W3 x! {6 M2 d9 H
    Min.x3 <- round(min(x3),2)- l# \3 q! y- Z$ Q" e8 {
    Max.x3 <- round(max(x3),2)
      B1 |6 s; m4 a5 q. n# rMedian.x3 <- round(median(x3),2)" B; ~9 v9 S5 U, c" f
    Sd.x3 <- round(sd(x3),2)
    " T7 Y: a* }7 T: q/ Ccbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果! y( _8 W4 D6 E. j8 W2 D0 \, v
    y <- data4$salary
    6 B+ b1 i) k5 E, j' d5 g' f3 mMean.y <- round(mean(y),2)
    / x7 @3 F' D2 f* c2 J# jMin.y <- round(min(y),2)) v$ k) z2 @& D5 [+ @9 _
    Max.y <- round(max(y),2)- k- ^& V  E0 p: A" j$ o
    Median.y <- round(median(y),2): K6 q" t: d+ n( a1 @# S2 Z; }0 h; v5 l
    Sd.y <- round(sd(y),2)& U! ~3 M; {% h
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果# x8 L" ~# E; }" L

    5 `- Y0 C: @! c9 `% i) P; \. k#66 @& k! t& Q3 F5 ~9 o; X3 W) s+ W
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    . e$ M+ p* D0 k3 Q- O' N# yround(cor(y,x1),2) #y和x1年龄
    % b/ W3 P7 q# [0 Jround(cor(y,x2),2) #y和x2居住时间
    : y7 p/ a7 K* C% t1 Q) P% uround(cor(y,x3),2) #y和x3朋友数量
    & C0 [0 A2 C) d' h1 H, f& Y+ u5 A! m7 w/ O
    #7+ m, [+ |) C& U8 @8 k2 k0 N
    #分别绘制数据集中因变量与各个自变量的散点图
    % B# U8 _3 f* e/ Z% K. fpar(mfrow=c(1,3)) #布局,一行画3个图9 [& d+ ^$ U8 o- [" w' p% z
    plot(x1,y,xlab="年龄x1",ylab="工资y")5 Z9 V) E9 ^) v0 Y8 g
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    ) u8 |+ a* U0 h( E. W+ c, _plot(x3,y,xlab="朋友数量x3",ylab="工资y")  O6 J' B; n" [6 c' W

    ( |4 |! ^' A7 v* j! R' h0 L7 m#8' k& A6 W0 {. x3 x1 \7 r8 C
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。' O' y0 p1 g% w' u
    lm.xy <- lm(y~x1+x2+x3)# [/ r9 N! w% r  I6 G- [1 u
    lm.xy
    & q; i7 E6 S0 `/ dsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    + f7 y9 u" q. {1 h% [6 \# @
    % d$ U+ w4 n. e3 @! Q/ H2 E#9
    9 Z0 X) H- k4 y9 ]$ f, l/ `5 T! |#对#8中的多元线性回归模型进行诊断,确定异常值记录。5 ]/ M7 k% C/ s4 N0 I
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列2 K; U8 G# Q2 Z+ w3 n+ u
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    " P, q3 w3 y4 R/ f1 v#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。& Z7 J6 G+ Q2 q1 p  K0 E, N
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。8 S4 ^* _9 Q; m1 j
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    9 n$ @9 b2 c2 nplot(lm)
    . V+ w, |0 _* M% ~# q* @9 rlibrary(carData)8 X1 T( u; M8 K8 S* }
    library(car)7 L' N7 S9 U3 B8 D. l
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    . d8 S/ b: g8 ^4 H; B# R7 |
    & u3 z7 B4 m" _3 F6 ^2 L* M! a#10  t! W- j; I4 T1 K# `! A
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    8 T3 W% U9 K0 P$ ndata4 <- data4[-136,] #删除该点( V# @' K) V" u- w) Y
    x1 <- data4$x1
    , r1 H9 F  o" f: L" fx2 <- data4$x2( L0 q* n+ q4 @& Q6 _
    x3 <- data4$friends
    9 _! \6 `( v. {( }; p" V: Yy <- data4$salary
    & x* A4 }& f3 Xlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    # O8 y0 x1 R1 k0 ^$ [' _% Plm.xy2# M! C& j' D5 t: @. o3 u

    ! Q, w8 p0 e( u9 N#119 g$ v8 l# C1 x$ x& @
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    ' [1 i9 `4 a0 L0 A' @  O' }vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    4 s; s1 f9 T8 e7 }& O
    & x: R- \0 m  A" x) K! F#129 L6 I4 S( T" l/ ^
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    % ]6 i: Y; \# O5 ~, W; G: I0 tsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    , O9 h7 L& v$ E5 a
    , H4 z( m8 J- z3 ^**********************************************************************
    6 _$ _' N* B. ~1 k: Z( ?0 {
    - D$ ^% g8 g# l  k- O0 o2 y二、利用多元线性回归模型预测收入) ]( t& O- r; {
    View(data4) #124条数据( m6 N9 Q5 K- M5 g
    #17 ]8 R0 @5 h7 b4 V. u* K" W
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    , `* V: H0 B& E2 ~5 J5 Dtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    5 e' l4 [% g/ S% ]$ u8 G2 T$ j2 _trainData <- data4[train0,] #训练数据) z# ?5 l# ~5 u7 @3 V
    testData <- data4[-train0,] #测试数据
    : |6 P5 B' J; Q& W  w! Z2 ~$ {2 B$ z8 q) d2 \1 y7 o0 o6 Q
    #2
    , n3 t$ S$ M- K; D% h#针对训练集,利用多元线性回归模型拟合数据。
    ; l( n7 p+ E; ?5 Flm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    # I2 _; }, k3 U0 }6 w4 J3 P1 ~- p: Z3 J
    #33 y' |. @5 Q, D( A- Z6 O( p2 g
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    0 F$ t9 q) K2 g8 ^summary(lm.xy3)8 f. e6 U2 o, s* \8 X; T8 {
    par(mfrow=c(2,2))
    , a" J8 x* r6 B- Q% |8 m8 J1 Nplot(lm.xy3)- V! D1 k0 X$ h" S! W5 U1 O
    outlierTest(lm.xy3)7 p# H. U1 \* b; c6 h" n) Y
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    / f; N! w, p" k  b1 A% W& f- Q7 b" ~! D# j- |9 j# P
    #4- V! e% o- p' V- F2 t6 L
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    4 c% O( [+ J$ Q& t2 t6 evif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)7 q1 C7 ]% ]) _! @( ~: _, @! X5 {
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    . c0 L' J6 S/ ^  D  u* Wx2<-trainData[,"x2"]
    + P* e/ F0 {$ Ox1<-trainData[,"x1"]; e/ x. t3 ~# p
    friends<-trainData[,"friends"]
      r9 r& }/ \/ @! ?: glm.xy3 <-lm(salary~x2+x1+friends)
    & C: R, @/ M0 A9 W4 J, |! b/ D- a; W: O* P) W" T$ k0 {% h4 Y/ T4 J
    #5
    7 `* Z7 o4 v8 |0 D# ~. e#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    - R1 {4 M$ X3 f1 s2 T, u#AIC检验,赤池信息准则,选择最小的7 n0 y2 [1 q/ o
    AIClm<-step(lm.xy3,direction="both")0 f  b: h* C* D: \
    #BIC检验,贝叶斯信息准则,选择最小的% t4 j, I2 H3 n$ {" u5 b& V2 I6 y) u
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    9 t8 ]1 g1 ~+ }" x' @
    ( Y+ t3 m4 g2 m/ X: U#6
    3 A3 P- L+ i3 U- e: j#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型; ?, L: L- {& E& [2 l% |
    #这三个模型预测的准确性大小,并进行解释。! Q6 q7 s) e1 S! G6 {
    Allmodel<-predict(lm.xy3,testData)
    $ g" Z7 s8 S; OAICmodel<-predict(AIClm,testData)+ s- k+ u2 j) K& d
    BICmodel<-predict(BIClm,testData)
    4 f& y3 K7 u) u# F; l9 a7 [#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    6 c4 O+ \. I) g3 y: b$ m#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    & X/ l& F2 U  s5 G# G1 g# Y#标准误差能够很好地反映出测量的精密度
    3 s; C3 Z7 c3 G3 HMSE <- function(x){
    & E: l; s' x' p7 f! s- q9 ]  mse <- sum((testData[,"salary"]-x)^2)/50
    6 h9 U4 x( f9 _- o; c) H  return(mse)' W1 o2 |2 Y4 l+ K1 a
    }* y* y5 M& o/ K' y/ R; [/ i  T3 b
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的' h" J8 A5 x4 p/ Z3 U/ L
    MSE(BICmodel), r/ q) ]. u$ X8 u0 b
    MSE(Allmodel)+ w+ o0 h7 j* i$ q, s- z& L
    6 a1 O9 M- p: G! t! R/ K

    . D( W$ ^! ]  u, d4 I6 w; g2 ~4 i/ p4 P: R1 B
    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, 2025-11-26 23:15 , Processed in 1.858720 second(s), 55 queries .

    回顶部