QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    8 B$ `' l6 ?+ i' O#1! @) l% T: i& z( j2 U' }
    #展示数据集的结构" g# K' v- D9 p6 r/ r9 e# i
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    % W: Z2 D; T& ~, |  m! Estr(data2) #显示的结果有一列是多余的,需要删除
    , a' \# ^* h; e2 n0 v- a6 w! ndata2 <- data2[,1:9]
    5 i  f. t/ `2 z5 s- Q. c" vstr(data2) #删完之后的显示效果是正常的没有多余列/ e. [9 V8 i, r$ ?# B* D" I+ f
    . G5 J3 _7 r# {7 K8 |8 C9 ^% j& C
    #23 }, R* E3 I; K& c* ?3 ]3 m0 Z
    #显示前10条数据记录* E7 _- X' R0 p1 B
    data2[1:10,]
    4 u. k4 {$ s- {( W# N# y" ^0 ?: Z: d$ C! o1 \+ ?
    #3$ z/ F* c. c$ T1 ~& G7 M; _
    #将变量名重新命名为英文变量名* N. r9 m$ }" p  u# f6 n$ p
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    9 D  J/ W4 m* N+ R; n7 j" bcolnames(data2) <- cnames7 Y% }( e2 m; v2 M+ m/ L
    View(data2)! _8 [% Z; W- n
    ; Y: v' p9 m  B, g. b0 m! S: v
    #4
    ( a2 P( H$ y) j2 ~* {#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    / A2 H1 R3 z- M$ F" x; ~* l: @/ `" Tx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    5 g2 X# f* t3 c#View(x2) #①先算出居住时间3 l1 G7 ~/ ?& ^3 e- s8 K' s0 M
    data3 <- cbind(data2,x2)+ f( q* q3 J6 P0 [0 O
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    4 J9 P7 v8 D$ z! G* j* H; d/ r( Slist <- which(x2<=0)
    $ l- c, P3 e2 P+ Ddata3 <- data3[-list,]
    4 w0 A1 ~8 k5 F  |- D$ ?, VView(data3) #删除异常数据后是125条数据  u6 g3 e7 ^# P& t7 i" v0 g' n
    7 V, e$ k  @/ S- J/ w, i- ?. f
    #5
    ( T0 V6 G$ F( E8 _* _0 B#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    9 i% m! ^/ D( _. @2 ylibrary(lubridate), i& _7 I. s& \
    date<-Sys.Date() #返回系统当前的时间
    : M2 D4 J; t! G3 q5 l5 n7 Jnowyear<-year(date) #提取年份' E" k6 u% [) f4 x
    nowmonth<-month(date)  #提取月份4 p9 `: G0 p& [% t0 O7 z
    #View(date) #查看现在的日期
    7 C7 U# _1 k$ r; |' q- N8 {#View(month(date)) #查看现在日期中的月份
    3 i9 p$ G& }2 D  M& }$ ~) d- M' Lx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    0 F( E  o. U, q# i# sfor(i in c(1:nrow(data3)) ){! ~1 t5 x! G5 N* Q
      if(nowmonth-data3[i,"birthmonth"]<0){
    : l6 [7 t4 x( R* I! g     x1[i,1] <- nowyear-data3[i,"birthyear"]-14 ^; Q6 t  I. _& m( Y
      }else{
    6 D) f3 V3 W4 E" F) d     x1[i,1] <- nowyear-data3[i,"birthyear"]
      e- c8 L3 I# T# E; L  }# G0 V, h8 s$ @6 v# p1 D& Y. L
    }* i) q9 T7 W. x1 o# x; Y1 e
    #View(x1) #算出年龄x1,并加入到数据表中1 s  K1 h9 o. G+ {7 g3 b6 [
    data4 <- cbind(data3,x1) . [( o9 A" C" L( o1 }
    View(data4) #加入x1年龄变量的新表展示
    1 f& R$ w3 c  V  \7 k/ nx2 <- data4$x2$ N8 _! j, y$ ~  s
    Mean.x2 <- round(mean(x2),2)
    - N/ ~! U7 x, a4 j  P' F" OMin.x2 <- round(min(x2),2)
    3 X3 E) f& P/ m0 @, T+ bMax.x2 <- round(max(x2),2)1 ?5 p- y) f2 i
    Median.x2 <- round(median(x2),2)4 S6 c& U  w. Q7 ?# v/ q# m& ^
    Sd.x2 <- round(sd(x2),2)) e( e( [3 \( L: P8 x
    cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    4 J" N# [6 ?1 ^3 V. c5 e7 U- EMean.x1 <- round(mean(x1),2)
    ' p  U! D1 K2 H+ ~) ?4 vMin.x1 <- round(min(x1),2)
    ( r7 q2 P! w0 D7 _& a- `5 HMax.x1 <- round(max(x1),2)0 E6 k: w$ k7 P. ?, U
    Median.x1 <- round(median(x1),2)
    : N+ \6 ?. N9 |8 h6 M( pSd.x1 <- round(sd(x1),2)
    ! z/ S& _, \; Q) qcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    " J5 k$ }+ U: ]4 E2 |/ vx3 <- data4$friends
    ; y- {" K  k5 ?6 KMean.x3 <- round(mean(x3),2)$ g, J$ ]/ c7 |1 W
    Min.x3 <- round(min(x3),2)
    9 {/ j, x- ~7 b2 r; L5 }9 DMax.x3 <- round(max(x3),2)
    $ }: {' h+ j! B( \# `/ o( kMedian.x3 <- round(median(x3),2)
    5 l6 N# h8 h" X5 Z; K8 uSd.x3 <- round(sd(x3),2)
    % ~+ b1 S- c: n. s: y6 \" scbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果6 J' e$ t' v  g& Q0 i
    y <- data4$salary
    . J5 G4 X3 d0 `Mean.y <- round(mean(y),2), R8 V: h- p  m9 i
    Min.y <- round(min(y),2)& ~# R3 s# s: \2 J9 r5 r# j+ f" g
    Max.y <- round(max(y),2)7 g, M/ P5 h6 j' S, l; a8 i$ o$ a
    Median.y <- round(median(y),2)
    ( `$ {" I4 X* a% B5 uSd.y <- round(sd(y),2)
    8 p6 s1 q  S# N. Rcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    ; I0 G7 z3 b9 z3 N! B* v% d; W' S" A  x5 v9 @
    #62 ?; N0 b$ [% J- h8 {# g+ w
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。
    $ w. y) t% M  M4 e3 K. T2 Uround(cor(y,x1),2) #y和x1年龄& ]+ Z# t- b$ m$ C0 v* I& ^
    round(cor(y,x2),2) #y和x2居住时间
      D9 ]* Y1 q: g4 yround(cor(y,x3),2) #y和x3朋友数量
    5 R6 Q& g: d& h
    . o( [* G+ p# T#7
    $ y& ]2 p, ]& K  j) i$ f; V#分别绘制数据集中因变量与各个自变量的散点图, _0 h7 i& S% u* ?) s2 U: f
    par(mfrow=c(1,3)) #布局,一行画3个图
    , c* R5 t0 b+ B0 e/ k# iplot(x1,y,xlab="年龄x1",ylab="工资y")
    $ o8 D; U& c# }$ Vplot(x2,y,xlab="居住时间x2",ylab="工资y")6 v, O7 F6 `1 H9 S' }
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")6 n: ?$ w, A" s" g0 d" m
    ; V: r) R& W, j5 N* R6 `4 _
    #8
    4 F1 d/ }# _3 u& X" |#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。: ?+ Y; W8 i  q0 J; o$ s/ y4 H
    lm.xy <- lm(y~x1+x2+x3)+ j3 }( H" p+ x% m& q1 C! C# P
    lm.xy
    - |8 \; w5 B; `" Fsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    8 h2 G8 @2 H* d! T. Z' Z# l" n* t$ Z4 ~
    #9* ]8 V. ~* i9 D2 `  E" d+ o
    #对#8中的多元线性回归模型进行诊断,确定异常值记录。6 D  y  _+ ^7 n+ \. I
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列# L, {+ l7 D6 j( P2 q
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布" J1 H  _4 }) ?2 z" [5 c' ~
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。! Y/ G/ \- J& e2 @1 ]
    #如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。1 {/ ~" A% x, B
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。3 p7 f7 v7 a+ E; c$ P/ X' v. y
    plot(lm)/ N) z; F# `" `
    library(carData), ^0 X% k: e0 k/ B5 t! g5 a- b
    library(car)# E3 V; W/ H+ b$ U: X5 L+ ^
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    , A( V9 R8 f* S+ c  o
    # G% x8 b" j! W6 v0 h  s#10& b8 C2 y+ k. f0 l
    #删除异常值记录后重新利用多元线性回归模型拟合数据。
    1 O! m. X/ R- ]/ E8 K9 rdata4 <- data4[-136,] #删除该点. P" [6 ]  V; Y2 s( `
    x1 <- data4$x1
    2 X) U+ F0 z" i: W+ i- \* ^  M' \x2 <- data4$x2, v3 F* y/ K! k8 ~
    x3 <- data4$friends) R! l4 d* A% }- ]4 N
    y <- data4$salary
    1 j& }2 q7 W2 d% ?$ v3 `) flm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    8 `4 U; Z: d3 \2 Q3 X. g$ M: k* q# Ulm.xy28 ^2 V, d/ H0 U$ B; r$ t

    5 R+ T1 R3 ^& N% B; f, S1 y& Q#11
    5 I3 R' J$ ~% ?( Y, E#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    - ~7 B0 Y* g, uvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在). ^$ h, i  r- \3 E
    7 q: V/ x0 g% e$ K% U7 _: E
    #12
    1 \, X5 S) [0 D#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。# s  G: K, n6 ]2 X7 c6 k
    summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    : H9 Y2 U% i. x6 I; K7 j" ^( h9 i
    . }2 _5 j& i+ K3 v**********************************************************************
    5 e( J% ?2 G: l: \3 j; g0 Q( z( ], y
    二、利用多元线性回归模型预测收入# ^; }) V3 s7 \  S2 L# q+ ~! @
    View(data4) #124条数据
    0 d- ]$ S$ f1 E, w#1
    % q* p# W8 i, F$ E# s#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。9 Z5 [" z3 K; q: N8 H! _' e
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集- E. T" A8 L5 N/ v& B- X! I: W. z. A
    trainData <- data4[train0,] #训练数据" w9 ?' N1 r3 X: E
    testData <- data4[-train0,] #测试数据
    8 o- q$ r& O2 ]+ l( y& p6 ^- Y1 _4 \+ L, w& h8 X
    #29 D4 u$ m9 i5 O+ X/ r
    #针对训练集,利用多元线性回归模型拟合数据。; R8 Q0 ]2 [) F+ s. z
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    & Q7 D. @7 m$ C* q4 c! ~$ Q& @6 v
    % e9 S4 @( g4 ]. [* E#3
      c4 n7 r1 t8 E#对(2)中的多元线性回归模型进行诊断,处理异常值。, P& ^  l7 e( W* o: F
    summary(lm.xy3)
    ) z* a& t. X4 y: m" u6 q- Q& tpar(mfrow=c(2,2))+ ?  ^3 q1 x/ I; c3 F( t  d
    plot(lm.xy3)8 G) B% ^( k$ l% h8 B* N
    outlierTest(lm.xy3)
    " v7 F3 j$ E6 l' O- ptrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    ( [" j  ]" M, w
    2 o; H$ E" `& L$ A& X6 p1 q% S#4$ q- \$ {, u2 q! s$ ^/ h
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    + d' K' v. |* K; y* avif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
    5 y. _" T. {& ~7 R! ]5 Rsalary<-trainData[,"salary"] #引入的数据是训练集的数据
    & O3 G* {4 Q- a# _' ^  J% F. px2<-trainData[,"x2"]
    0 U  G" A" Q) e' V, s7 s1 wx1<-trainData[,"x1"]3 o) d% {" j9 ^4 z# o+ h; m/ B% E: [5 y
    friends<-trainData[,"friends"]" R. B" |) p8 l% Q$ B- t9 g+ b
    lm.xy3 <-lm(salary~x2+x1+friends). a9 Y  x& m+ D

    * D; {6 f, k5 [! p* n! Q#5% \* k! n3 o" P* z+ }' z' E
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。8 n  w+ o/ i. M0 L. L6 r% X. J
    #AIC检验,赤池信息准则,选择最小的/ f% N. I3 T1 ]4 O! T9 h
    AIClm<-step(lm.xy3,direction="both")
    8 G* I! L, o4 u# F% g#BIC检验,贝叶斯信息准则,选择最小的5 {; J, D7 Y! y* P
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    , S+ z- S7 K. F* J: H
    " e" ?) K1 A4 F% m% p8 B# a#6$ l; b* R  G& {7 Y
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    ) u8 {$ }6 ]5 x1 q( T#这三个模型预测的准确性大小,并进行解释。* x7 l+ m: K9 A  F9 M: r
    Allmodel<-predict(lm.xy3,testData)
      g  V( \' k8 Y, h' RAICmodel<-predict(AIClm,testData)
    3 Q8 e, n$ e3 t5 d) P7 LBICmodel<-predict(BIClm,testData)) Z) w; D' d: {: L0 G
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差. d4 Y# v) d4 j* Y6 a% T
    #均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
      o- \5 _& @5 S, E: l#标准误差能够很好地反映出测量的精密度& n  n: ]; z2 V2 e, B4 s- x
    MSE <- function(x){) g- b2 ~: E# G5 L. Z% s
      mse <- sum((testData[,"salary"]-x)^2)/505 g) Z. v6 g3 K/ `" a9 o3 o
      return(mse)
    1 r0 ^8 [% `2 @! z6 L}, v- z& S# C' j5 f
    MSE(AICmodel) #AIC/BIC/ALL是误差最小的
    ; H$ s$ z1 ?0 O, g, a* W6 u, RMSE(BICmodel)
    ) P- i1 p& V" \: m* BMSE(Allmodel)
    , X6 \4 n$ X2 V' G; s5 H% i( c  d: D: p% l$ T; u* R3 l5 C
    ) K4 [: I8 K9 I
    9 s1 i1 }, `1 G1 r  n5 N+ r; V; y
    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-7-27 04:43 , Processed in 0.591202 second(s), 55 queries .

    回顶部