QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素( v( B, }* A  c0 ~$ n2 k! n3 o
    #1
    * ^. `4 i" p0 q" i#展示数据集的结构5 }* I7 i7 g; r/ @# z8 Y
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    4 b9 I8 B' x) g# B/ P1 z+ N8 B. Nstr(data2) #显示的结果有一列是多余的,需要删除
    8 t+ ]) K. Z1 t3 W1 ]3 [0 Y/ Tdata2 <- data2[,1:9]
    9 k  G, r- y# b) v7 n0 Wstr(data2) #删完之后的显示效果是正常的没有多余列
    ! h% T" i$ H" S
    0 _! u* \  u: B6 y% S4 p/ k* i#2
    ) g. t- a4 r$ o. d#显示前10条数据记录
    / S# @4 K, c" F( N6 W* B* rdata2[1:10,]/ d7 r) c  J! ^, U$ M

    0 C0 R: z! T' s) g" w2 |* ?+ O2 L$ m#3
    . w- K/ g$ C2 d5 I+ |#将变量名重新命名为英文变量名  J! {1 R7 I7 X, S
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    * S. Y# Q7 z( r9 u& |colnames(data2) <- cnames% Q; z+ V& C! e5 p2 A% r
    View(data2)/ u) R7 {/ i  Z. e
    * Y+ n  `- p( H
    #4
    # s) @! c8 H. g0 z" }: R#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录# I" }' e$ P: S! ^
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    * q5 F! S! r  J( i# j5 L4 c#View(x2) #①先算出居住时间/ M3 Q0 V% e' V
    data3 <- cbind(data2,x2)
    3 v1 S3 L) b4 _0 o; J+ M3 L#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条7 o) b8 V+ n1 h! |* ~3 H3 ~
    list <- which(x2<=0)1 D' v- i8 g* A- P0 b( A
    data3 <- data3[-list,]
    $ z7 P1 M. v+ s# MView(data3) #删除异常数据后是125条数据
    $ Y2 Q6 N# M( f4 b' Q$ x9 j  g: q' t2 L  ?% p1 v
    #5
    + ]! W/ ]% @* P#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。) u& C% h, v8 o
    library(lubridate)% t4 B0 t$ J/ ^" w5 I- S
    date<-Sys.Date() #返回系统当前的时间' M+ q5 b- s0 R# U, Q& ?2 x$ b7 D! s. E
    nowyear<-year(date) #提取年份3 Z& I6 f9 `/ ~2 i6 J
    nowmonth<-month(date)  #提取月份$ ]# T3 r7 M* d0 V( x( i
    #View(date) #查看现在的日期
    ( V% v' n: K4 D: A" i4 r6 C( }3 W: {#View(month(date)) #查看现在日期中的月份5 X! E2 }5 g5 L' c
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))" }$ T+ R7 o4 I) Z: V( B# M$ b
    for(i in c(1:nrow(data3)) ){( }$ o, r9 q3 F8 Y/ q+ C3 A* G
      if(nowmonth-data3[i,"birthmonth"]<0){
    . h. ?3 h: G# c' F) T     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    % `# I! C$ Z  U& {+ k  Y  }else{* B+ k1 X; ?$ z" J8 [1 H* ]
         x1[i,1] <- nowyear-data3[i,"birthyear"]$ r8 |9 w; \1 B) l; _
      }7 y  k% b& K5 G! i9 d
    }- Z! n( y  N. U1 M4 z
    #View(x1) #算出年龄x1,并加入到数据表中2 a8 i8 E+ d. _% H
    data4 <- cbind(data3,x1)
    + {; q6 b" E+ H5 fView(data4) #加入x1年龄变量的新表展示$ C) b4 d% p0 R& D8 T  ^  n
    x2 <- data4$x2
    " u8 D$ {0 |6 E9 U' [( Q; E# `" }Mean.x2 <- round(mean(x2),2)( H) a% B  P; J/ K6 x
    Min.x2 <- round(min(x2),2)
    / c) v8 K4 H; H! s7 J5 WMax.x2 <- round(max(x2),2)2 ^4 I* g, M9 T$ V
    Median.x2 <- round(median(x2),2). l! O2 K) b$ O
    Sd.x2 <- round(sd(x2),2)- ~. i( B- M$ j. P! n# g2 G
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    4 X) u+ ?* C& M. jMean.x1 <- round(mean(x1),2)
    6 {0 u( T- `& B  ~" h, VMin.x1 <- round(min(x1),2)! e5 k/ f) R$ P- @7 T
    Max.x1 <- round(max(x1),2)3 \6 S' @. p9 T$ p
    Median.x1 <- round(median(x1),2)4 f* }; k; |2 A" P2 j1 P
    Sd.x1 <- round(sd(x1),2)3 Y* h! L) A5 Z" b1 M- O
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    5 J, G1 B3 I  g1 sx3 <- data4$friends
      b9 X, l, V( l; qMean.x3 <- round(mean(x3),2)
    1 Y/ J6 @2 v2 E* `+ E* P. }Min.x3 <- round(min(x3),2)( j* G) m3 {2 }2 l; D* f' ]8 K
    Max.x3 <- round(max(x3),2)
    $ K- ^0 l  ~. B3 Q9 B6 SMedian.x3 <- round(median(x3),2)3 @+ Y* W6 E0 X# N  d# ?
    Sd.x3 <- round(sd(x3),2)
      k8 l: ?, j- Tcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果9 |) ]  q5 p+ Y
    y <- data4$salary
    : a! K$ d" @  P6 w6 WMean.y <- round(mean(y),2)
    . O7 |! n$ @% I! @( _. ]Min.y <- round(min(y),2). X3 r: V5 l$ d6 }; \, h
    Max.y <- round(max(y),2)
    + |, J3 R4 H$ XMedian.y <- round(median(y),2)0 u8 D/ F2 ~! N2 n0 ^
    Sd.y <- round(sd(y),2)( z, K/ b: o, b  H3 @) c: y
    cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果: ^  e! c6 s" b' S! v; i

    0 ]8 o* l3 v& G- O#6
    ( c3 A+ b. I* t9 \7 p) F# k; C#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    0 F7 k2 u! U8 g- K* W" Lround(cor(y,x1),2) #y和x1年龄
    0 ^& U/ w9 H& x/ c$ j# U0 [round(cor(y,x2),2) #y和x2居住时间8 s6 _; N2 o& L9 |
    round(cor(y,x3),2) #y和x3朋友数量
    6 P2 L( i+ q' _$ i8 W+ \) T1 a$ _' z  [1 }3 ^  H& A* W# c
    #7
    " a& \; X& u- D- ]' |' T- h#分别绘制数据集中因变量与各个自变量的散点图
    / N6 ~& ^' x8 z2 I& Cpar(mfrow=c(1,3)) #布局,一行画3个图  j+ i6 m/ d; h9 i1 ~7 X$ M
    plot(x1,y,xlab="年龄x1",ylab="工资y"); L, w8 k* K$ I6 R! }/ c
    plot(x2,y,xlab="居住时间x2",ylab="工资y")
    - G  V. ^4 Z  U- X6 Xplot(x3,y,xlab="朋友数量x3",ylab="工资y")
    ; S. D2 U" j- P& B" ]
    : H$ q0 K! H" k( u0 y#85 b5 I: P  a! t& i
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    8 ]- I1 ~$ U8 p7 z4 p* vlm.xy <- lm(y~x1+x2+x3)2 P  f' x; C) `/ p! e0 M# A  U
    lm.xy
    3 U, r) I* @% Asummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的) E" C! {3 U0 z6 C7 |4 v: W
    ! [6 q& g, F8 M
    #9
    & `! ^% e; U# @' G  B#对#8中的多元线性回归模型进行诊断,确定异常值记录。6 E( z4 Z* c- H% w- m
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    * m. f9 L0 c: Q. P#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布% [* n# c( ^3 D5 y. U* T
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。. s. e7 M2 h7 [$ a
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。5 R' r4 ~, ]* A- Z3 _) D* x
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    ' D; U) x& |! H% [plot(lm). w" A: ?% @: j1 _
    library(carData)
    . a% I" |+ u# K/ }/ Alibrary(car)! f# o6 J- V8 b+ V. F6 ~: ]7 }
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    # y" ^; l7 Y+ u$ e8 a+ b* e: X  X. e, A3 o, X- K/ _8 h
    #10
    1 h# V- W$ i& _4 x, ?#删除异常值记录后重新利用多元线性回归模型拟合数据。
    + c% |' o" g6 c$ p1 Tdata4 <- data4[-136,] #删除该点
    % G+ Y! Q( w  @  k" Ix1 <- data4$x1: `! B  O+ P, X8 q
    x2 <- data4$x2: f0 \2 q% }- Y; e/ e: s6 A; d
    x3 <- data4$friends8 O2 y8 J: O, r" g
    y <- data4$salary2 ]" w) `5 a9 L/ P  V1 N8 h0 B3 a
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型" f4 j+ S* Z) ^7 C5 w1 [- m
    lm.xy2
    + J$ b  u' F( p' L( o4 J, a+ X/ H% C
    #11  ~/ o. m% H( ?" W* T# N& E7 G+ Q
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    5 b/ r9 v0 {$ P# V' n$ F  Ovif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)/ l/ g/ J, L5 Y
    9 X( D8 M8 J. j3 v5 u4 e2 S
    #12
    , h" Z( N* b. Y" y#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    & A2 p& a7 M7 t4 c7 Fsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    % m( B9 b! ^+ U. F* d, u- ^
    . x6 ^. W* N; a: G1 w, p3 u- _) h**********************************************************************0 G2 b# a  b: A

    5 m  m# M, a0 @9 @二、利用多元线性回归模型预测收入
    0 E3 x0 ~  e+ C6 H+ ?- c6 FView(data4) #124条数据
    2 b7 R. {' R4 D1 K, L#1
    9 [5 h  s0 ]- Z. E4 R#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
    : _) g/ q  y  i' t; xtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    8 e. D6 G, T* J1 b1 `% v& a9 q4 ytrainData <- data4[train0,] #训练数据8 j" v. Y( R4 X' d$ J0 N' r) Q3 M
    testData <- data4[-train0,] #测试数据
    . X9 m" S: c2 ]7 a& I( F% B; Q1 {' D
    #2
    , e( Q* F$ ?4 b. X#针对训练集,利用多元线性回归模型拟合数据。
    ! k3 z! W1 E( K, \; W7 b& g; {, Nlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])  B% U1 z0 ?5 ]9 n) H& O* v5 X
    1 w6 T, w. h& J0 L* n, B
    #32 T# F$ a6 I  m+ X
    #对(2)中的多元线性回归模型进行诊断,处理异常值。8 u$ d* j! F" A' Z/ [
    summary(lm.xy3)5 O- O9 L" x: L: u
    par(mfrow=c(2,2))' Q, R/ U4 p, l" M, A) L% L
    plot(lm.xy3)& ?' |2 |  I# K
    outlierTest(lm.xy3)
    5 i& Y! i9 l5 f# V# c$ v4 z7 R: NtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    0 z8 f6 t# H' z! i3 r& j; r$ Z" J+ K  i! w5 `; M" t
    #4
    + ~6 n" E, I; c#对(3)中的多元线性模型进行多重共线性检验并加以处理。. p4 F: {+ @4 B) F1 T; N
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)2 M0 q  y* N" Q) Y' g3 M
    salary<-trainData[,"salary"] #引入的数据是训练集的数据5 L4 p: F& K; D# o2 p/ p
    x2<-trainData[,"x2"]
    ! [. L$ B# D! _0 p7 tx1<-trainData[,"x1"]
    5 [! W2 {' p) e* }- bfriends<-trainData[,"friends"]
      C* k/ y# g, z% c2 |9 P4 slm.xy3 <-lm(salary~x2+x1+friends)6 O: f; w2 P% T8 g0 r

    ' y: z( r3 A1 x4 b* x#5
    / _# O1 S& Q: ?: U8 m#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    5 N( s$ J1 x* L#AIC检验,赤池信息准则,选择最小的/ f# Q3 Y, ~  e+ z+ I+ O
    AIClm<-step(lm.xy3,direction="both")" m9 v1 B$ _  [  `2 N9 z
    #BIC检验,贝叶斯信息准则,选择最小的2 F8 ?% d+ Z. f7 V6 V+ Q
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")- |! v8 T+ A, u2 h7 Y/ u

    , U) N* W3 |! s# m6 G% n2 M. A5 C#6  L/ g, \* N% \1 V% k; `6 H; f- }% n' [7 ^
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    + `; K7 ]! s8 y1 s% B#这三个模型预测的准确性大小,并进行解释。2 O2 y* V- ~0 _" k* h. k) s: y
    Allmodel<-predict(lm.xy3,testData)
    ) V; L+ q& c& D$ D2 u1 GAICmodel<-predict(AIClm,testData)
    4 N8 @5 c- r3 V$ d7 \# fBICmodel<-predict(BIClm,testData)$ }+ v: p; t8 A4 Y
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差. }' L$ h3 F0 I0 b/ a' W; N7 M2 v+ O
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根; f4 g' K# s; l, v  r
    #标准误差能够很好地反映出测量的精密度
      }& \+ V. g& V, SMSE <- function(x){
    * G- M- |3 d- p+ V( I3 K0 O  mse <- sum((testData[,"salary"]-x)^2)/50
      z& Y7 a9 M4 s4 n# U  return(mse)
    + J( k  B% ]+ I7 p7 I}8 b  _' l) Q: |" K/ ?9 C) g
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的9 I6 m; D, q! d; L: S, m6 M
    MSE(BICmodel)" ]- [8 w3 a# p. q' e' p: B
    MSE(Allmodel)
    4 }+ L( a$ }* I$ x6 j- g+ U, ?* b! k( E- P
    7 T: t1 N, j4 j; h' [

    " s5 l5 @/ ?) E( A* {+ v3 V6 z. z
    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-10-3 14:42 , Processed in 0.466620 second(s), 55 queries .

    回顶部