QQ登录

只需要一步,快速开始

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

    一、背景
    * M; e, }  C' U1 V& o/ X3 e数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

    二、要求和代码

    一、分析收入的影响因素7 n, X- }% i" H7 g- _5 [% J
    #1
    4 h) x2 r0 j9 J#展示数据集的结构
    ' ]2 n9 A# a3 |$ y1 Cdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    ; v! F4 [! N% s& K$ cstr(data2) #显示的结果有一列是多余的,需要删除
    6 G1 {( D0 Q) C3 g0 ^1 n% e! ~- Jdata2 <- data2[,1:9]1 p1 k) N  f3 k
    str(data2) #删完之后的显示效果是正常的没有多余列
    ; f- M% m3 J% b+ h. }. R
    3 Q7 A  l% b& @- Z% O( R2 M- c3 {  f#2
    1 C1 D. q* O! O1 {* i4 q( {4 G#显示前10条数据记录
    3 D' ?0 Y1 V* T" F- [& |" cdata2[1:10,]( T6 g; \; A; g) ~4 q  X0 E1 N
      J! i% h' `) e+ C( Z
    #3$ c2 y( s+ m8 x8 ]. `' H
    #将变量名重新命名为英文变量名- e% w7 l' @& E2 g! w+ b- \! E* s
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    ) X3 v# n& d1 V0 [! l& v$ |4 Lcolnames(data2) <- cnames0 U/ \  E1 O( u. l: j
    View(data2)2 H5 Z# e, K# m3 j7 |

    - [" p  ^, l( l# Z- j#49 x: F' H7 r* _
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    ! m+ v. G4 Q* Ux2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    & }: Y: h0 i# d) e' e$ o#View(x2) #①先算出居住时间/ X" B$ A  [1 t( `1 s, g8 B. ~/ z
    data3 <- cbind(data2,x2)& I8 I5 y, L( `9 t7 u
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条  ~2 o/ m' c6 O/ x
    list <- which(x2<=0)  X3 D. u9 O' `4 P6 ?, n
    data3 <- data3[-list,]
      ^6 T) R' P6 b3 [. {View(data3) #删除异常数据后是125条数据
      N& J; f' w& b) ^
    ) V( `) K! `1 W6 r7 S#5! o) Y8 L* q0 \2 S6 T9 a
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。  k" J' d8 r, B0 k0 R1 A; o* [; u
    library(lubridate)
    / ~# w6 b+ o, ]; }6 s( J- O1 }date<-Sys.Date() #返回系统当前的时间
    + J6 P3 N2 L7 K9 K) \nowyear<-year(date) #提取年份: W( ^% W# L+ b3 q& |
    nowmonth<-month(date)  #提取月份
    : Q3 J; i" u9 D  W" A3 H, f#View(date) #查看现在的日期: _( {" k! a. o4 @: |
    #View(month(date)) #查看现在日期中的月份
    # Q- @( \, ?7 p7 B- a8 E, {% ix1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    4 t3 b1 ^/ ]5 U4 kfor(i in c(1:nrow(data3)) ){
    $ j! J) ^2 f/ w# `7 x6 s. X  if(nowmonth-data3[i,"birthmonth"]<0){. A# a$ Q$ Z: p  L5 J& H$ k
         x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    , S$ ^" [4 R4 ~; A  }else{- T8 o  D. w3 ?# a; D! z2 J  g
         x1[i,1] <- nowyear-data3[i,"birthyear"]5 R! \: v+ B# v
      }/ u. R8 ~& ^( J. X" Y, M
    }* }" r; t# n" l* f3 o
    #View(x1) #算出年龄x1,并加入到数据表中: A6 X+ f' k1 X3 d& J& ]+ i
    data4 <- cbind(data3,x1) : D) u; q0 F; Z: e+ z
    View(data4) #加入x1年龄变量的新表展示2 Z# u& M' G$ S' g
    x2 <- data4$x2
    ; A. t, H% v, m/ }$ _  i, Z2 [; jMean.x2 <- round(mean(x2),2)
    ) O5 o  w8 ]! Y7 m, L3 p. fMin.x2 <- round(min(x2),2)
    / a3 c5 j. V1 C, j  lMax.x2 <- round(max(x2),2)
    " e% H) S7 T4 a$ OMedian.x2 <- round(median(x2),2)# ?8 f) {& u6 [/ a
    Sd.x2 <- round(sd(x2),2)
    ) B6 V# Z* W( v! ^# i8 mcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    + u5 l6 {# `# ~  H8 L8 nMean.x1 <- round(mean(x1),2). Q- Q% H2 a/ O2 J
    Min.x1 <- round(min(x1),2)8 C! f" W7 Y4 t8 h9 z4 o; v" Z5 @
    Max.x1 <- round(max(x1),2)
    & d$ B, e5 z* W7 z/ O' c2 oMedian.x1 <- round(median(x1),2)2 u4 ]; d0 W! V- E  T8 Y
    Sd.x1 <- round(sd(x1),2)! V5 J! O* F4 ~1 q; W6 F2 g
    cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    % C! ~+ r, f1 ^. e2 K% Dx3 <- data4$friends( [( q' q) E" N: ^  d$ x! a1 Z
    Mean.x3 <- round(mean(x3),2)
    * `$ V2 M3 |( x. Q# gMin.x3 <- round(min(x3),2)  i; |* H8 l8 N' U0 w- [7 y
    Max.x3 <- round(max(x3),2)2 ^3 P2 s% o0 C( |
    Median.x3 <- round(median(x3),2)/ x/ k( B. b8 I( R% {7 t+ A
    Sd.x3 <- round(sd(x3),2)
    8 G7 U! Y6 r' B- `' F, P9 Hcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果$ j8 n' V$ x3 q4 M4 E1 x  W
    y <- data4$salary
    $ L- {1 a/ F+ C9 ]$ G$ o) hMean.y <- round(mean(y),2): Y3 X' A! d2 T6 K7 E% T( W
    Min.y <- round(min(y),2)% h, E: ^5 Y: D5 e- g
    Max.y <- round(max(y),2)- ~( _2 t6 E' b
    Median.y <- round(median(y),2)
    # `! O) S. `6 K% i: VSd.y <- round(sd(y),2)
    ) G, h4 k( ]% \; U4 P1 Ecbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果6 g8 b% A& A9 V, e

    1 A) h1 v- [8 m. ~' F5 S+ A; {#6) ^+ X! I+ S, Y/ Q+ x
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。% ]6 D3 u. C) {5 y. A7 E
    round(cor(y,x1),2) #y和x1年龄
    ; I  S  O2 ]' Xround(cor(y,x2),2) #y和x2居住时间
    , k, j! `4 k7 W* C6 X* Y1 fround(cor(y,x3),2) #y和x3朋友数量- a9 b6 [) Z! n' Z6 B4 _

    / J" Z' W' I3 b1 p/ }#7& r7 O! B; R- a  c4 a: @7 Y3 h. u
    #分别绘制数据集中因变量与各个自变量的散点图
    3 s) ~4 q2 w: Z9 B- apar(mfrow=c(1,3)) #布局,一行画3个图
      q) @/ [5 ^4 O1 C( Y& h+ wplot(x1,y,xlab="年龄x1",ylab="工资y")
      w# [4 g: m) Z9 nplot(x2,y,xlab="居住时间x2",ylab="工资y")5 E4 t0 n2 k& ]1 R5 q: I
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    0 ^) h0 q/ U7 @+ I; _
    " O5 s6 V( d( e4 }: `6 S#8( n8 I5 u8 ~; u9 L
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。) w( p$ _# h+ X, J
    lm.xy <- lm(y~x1+x2+x3)' A: P- @1 @: ]4 j" J
    lm.xy1 J5 X7 \% O: C3 X( _8 D' W
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
      m9 c, L% n8 D% n3 t& I' |( r* _7 M, A. l' l4 d
    #93 N& T: t1 P# a5 K) ]4 p
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。
    6 e2 U- ?. y; C) x0 epar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    ; O- W: H+ r" _6 z$ H$ Y0 i8 g& k9 t#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    8 i6 z* Y* W  }6 {$ G8 S$ \/ M#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    ; {5 F, M8 ^" i; n) J7 n# u#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    * p( J' ?6 g/ B& A#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。' b' S/ @& M4 B2 ^: v. }& V- A  ?
    plot(lm)3 t6 k' {) T+ R, K: C
    library(carData)
    ( N* I5 H. f" d4 _6 z, Zlibrary(car)
    + {! h, S8 H/ LoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    3 V" e1 H7 a: E) J
    * A' I3 l, _! k8 s9 x1 M, r#10
    . [  n. }8 Y$ j& e#删除异常值记录后重新利用多元线性回归模型拟合数据。
    " M; d! P3 ~- D; G! M2 idata4 <- data4[-136,] #删除该点
    / i) \: x- \& o  u2 ^/ @x1 <- data4$x1
    ; J4 U6 f0 U+ `0 o3 Z0 a$ O) Lx2 <- data4$x23 l4 g9 H( g2 y% b5 U$ T
    x3 <- data4$friends6 M* v. l$ x* p, `; j5 J- ^
    y <- data4$salary
      E9 t1 u8 a0 k- ulm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    % H8 \' j! h& N7 ?$ q. [5 x2 {. {7 Ulm.xy2
    ! [% ?: Z1 m2 {  ?6 v! O9 H' I; ^
    #11" [5 P7 s$ n+ @1 ?- c! u% d
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    : n; q. w' m' L- }% k# }, Bvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
    % D/ H- X2 r: y4 ?9 L! {( [: w# b$ x) u2 C0 e1 K
    #12
    . N, {, A8 ^) R; j#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。1 [+ u. v: k1 s  d
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星0 t% R% f1 }8 X/ g( K
    ' h- ^1 u0 Z4 w: H. s+ L
    **********************************************************************
    6 ~' T. [9 _2 I3 I& ^/ c8 J
      M7 V$ l. [3 ^3 |1 N二、利用多元线性回归模型预测收入1 x2 M' q/ |# U9 z5 w
    View(data4) #124条数据# m0 L/ O5 z0 ]! F* B
    #1
    1 E# Z& F6 o- }) D#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。3 f9 H8 A" i) @/ Z
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    8 b4 A' x  x: Z7 N: ]) RtrainData <- data4[train0,] #训练数据4 T3 @' c9 \% P" Q% K0 ?0 W
    testData <- data4[-train0,] #测试数据( `2 ?0 \! {, O/ J1 b

    % {3 U% Q- j: A; F* C; x& }* P#2/ M( i+ C4 y: J( w! N
    #针对训练集,利用多元线性回归模型拟合数据。& G# c% u# R/ E, G5 ^, s; `) E
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    " N3 J& p, J, d/ `# U4 h9 n
    5 j& r, A; L: H* I3 q* K4 D#3% U' H6 E3 J3 f, h: ^% L  U
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    % \) I2 y( S# F& I3 M5 @4 Gsummary(lm.xy3)
    + G/ u: i5 B' _) vpar(mfrow=c(2,2)). [# C; C7 B. K; V8 [7 W/ K% H7 {3 C  K
    plot(lm.xy3)
    ) `& a1 i! d4 E0 O! SoutlierTest(lm.xy3)1 _* B' Q. _; z  d+ g
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    ; H9 R* y! K3 S1 ]6 I9 P# R+ z+ A0 X9 \' Y& Q
    #42 W( S9 Q! u: W, |9 O0 a( Z( f
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。8 q5 S$ `/ M; |# }& ~
    vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    - u3 {* A$ x1 w" E+ C$ y  Msalary<-trainData[,"salary"] #引入的数据是训练集的数据
    7 x% |6 E( [, `/ n* O3 gx2<-trainData[,"x2"]
    4 f  i/ |- m% n+ ]( rx1<-trainData[,"x1"]
    & P  K+ N. W( ]friends<-trainData[,"friends"]6 [  X1 ]# p7 L+ N- ^
    lm.xy3 <-lm(salary~x2+x1+friends)
    9 O" Z' w% M( f- `# y2 @# w2 u0 o/ m$ w; l' p" l( i
    #5
    ; ?' r! s; b2 n1 e' z! F3 U+ i#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    6 G6 ]+ @2 P7 g# C* C#AIC检验,赤池信息准则,选择最小的
    4 p9 G! U( |! O% U# A5 i; |! EAIClm<-step(lm.xy3,direction="both")
    " t/ F, P2 Y# U#BIC检验,贝叶斯信息准则,选择最小的
    7 ^0 V& @* J. wBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    ! A1 `( K9 H4 Y5 s( S( l9 I
    4 d, }+ Q0 f/ V; o, ?/ I: K#62 ~9 |: ]7 E- n# R/ Y
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    . @5 t2 D3 x7 d3 V: O# ?#这三个模型预测的准确性大小,并进行解释。4 m2 {3 ]& A# b, C
    Allmodel<-predict(lm.xy3,testData)8 X/ `2 \/ p$ ^$ g2 Y5 A
    AICmodel<-predict(AIClm,testData)
    # x$ C  e! w  t" s6 Z) D1 DBICmodel<-predict(BIClm,testData)
    # {/ y# h( _" ^' c#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差2 [& x* H" T/ k, u) E
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    7 P. N' H, V3 |/ z; E# b; t, c#标准误差能够很好地反映出测量的精密度8 k! k" z: r9 F5 v* _
    MSE <- function(x){
    9 t4 e( E' \9 @  a/ I* M. z, k  mse <- sum((testData[,"salary"]-x)^2)/50
    5 B! X) A( W+ ]) C( X2 Z+ ~, z  return(mse)
    # v! J9 \4 ~2 f/ s: J1 j}1 K& |( w# {* E$ M3 G
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    % Q3 G; ~6 {4 z2 S( [- xMSE(BICmodel)4 V" G6 V1 w1 w0 O5 ~! I1 T
    MSE(Allmodel)4 P. A; W7 G2 p  e# L

    " P* s$ r* i- ~. r; f8 S
      z; B% f- |& u# M- L! d
    8 S( V! c+ T+ J& [0 f2 T& o" C
    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-13 10:55 , Processed in 0.449453 second(s), 55 queries .

    回顶部