QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素
    8 W# A5 C7 H2 ~! K+ b! f2 M#1
    1 t3 d' k4 v6 ]4 P4 |#展示数据集的结构; a& @+ h% Z1 u' y% L
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")3 Y6 q3 T& ]' O  \5 A
    str(data2) #显示的结果有一列是多余的,需要删除/ y6 {9 @# E0 p( c+ |
    data2 <- data2[,1:9]
    ; k! h+ _/ i+ pstr(data2) #删完之后的显示效果是正常的没有多余列' L8 n2 p1 \7 l
    6 k* N0 w( d  D* G. y+ I
    #2( t' B! P" w" |
    #显示前10条数据记录
    - U7 l, |5 A% d" t3 p6 Y( O+ Mdata2[1:10,]
    ) X6 Q) k5 K  \" z7 u, ]) @/ ^% ?% M8 z
    #3
    ) j, k( D7 E* X8 w, w1 e#将变量名重新命名为英文变量名8 d: s# O5 @+ f, @' f; e3 r9 E
    cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")/ i2 {7 x- x" g5 O
    colnames(data2) <- cnames) C5 L5 N$ I+ K
    View(data2)
    / B/ q3 }" M$ n/ Y* B0 s& `7 o0 k4 h2 K: U9 q5 n
    #4
    / Z5 h2 Y4 R; n1 ^+ W#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
    + C9 q5 t. U0 W; D2 y4 Px2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
    & g" A2 Z- y- T3 u* C#View(x2) #①先算出居住时间
    2 c. m" A% L  P6 o9 Z9 Gdata3 <- cbind(data2,x2)
    2 c% }; T& Y1 `8 _) b#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
    . ~1 S2 H$ r$ ~6 ~/ Glist <- which(x2<=0)
    9 \0 a% f0 _! [5 [data3 <- data3[-list,]. C* |$ D5 o! f
    View(data3) #删除异常数据后是125条数据9 n* I; k% Y! K' \8 [+ b

    5 D6 s- j' D9 V#54 f! |: g+ c7 Z
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    - b0 O% ^5 a& Tlibrary(lubridate)) `" d, F" @. ]  g# |1 i3 H
    date<-Sys.Date() #返回系统当前的时间2 ?: P: Y( [3 X, c% b$ F
    nowyear<-year(date) #提取年份4 i" B& h3 c1 S6 s* ^# B% w6 T
    nowmonth<-month(date)  #提取月份9 q, f: |. z1 }: ]
    #View(date) #查看现在的日期4 P( s" Q) ?. O9 i5 N
    #View(month(date)) #查看现在日期中的月份0 O; K9 p& O) z. ^
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
    ( v3 W3 t. l. B1 Ufor(i in c(1:nrow(data3)) ){
      v$ b0 @" Q3 B1 j  if(nowmonth-data3[i,"birthmonth"]<0){
    : d8 R2 [# G9 H     x1[i,1] <- nowyear-data3[i,"birthyear"]-1/ b" ^: K  |* j7 u+ k* D4 Z
      }else{
    : ~$ ~, F, n( {! h2 p     x1[i,1] <- nowyear-data3[i,"birthyear"]
    # H9 N7 s0 c& {$ T  }
    1 L' E( D+ Z5 @$ C}
    , {. D0 \$ m5 L+ o5 ~#View(x1) #算出年龄x1,并加入到数据表中
    $ o: V1 g4 }3 p* xdata4 <- cbind(data3,x1) ' d6 i3 d" O1 R% F# v; P# K
    View(data4) #加入x1年龄变量的新表展示1 j3 ~1 y; v2 s* Z% ~
    x2 <- data4$x22 Y3 K0 B0 x  l# O3 L
    Mean.x2 <- round(mean(x2),2)8 x' y9 P7 @3 \
    Min.x2 <- round(min(x2),2)7 l4 S; u% f% K" Q, w( U$ I
    Max.x2 <- round(max(x2),2): T6 h" a0 m4 c1 L: {! `
    Median.x2 <- round(median(x2),2)
    ! A) F! g3 m" LSd.x2 <- round(sd(x2),2)
    4 d4 O4 W1 w& F; _  W8 S+ j/ z# _cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果2 k7 r( c8 ?! y; z$ Z
    Mean.x1 <- round(mean(x1),2)
    7 M. C8 O! M1 I5 \4 FMin.x1 <- round(min(x1),2)
    1 R* ~2 L6 B  {  D: m9 uMax.x1 <- round(max(x1),2)1 \! y# c7 _) O4 n& F
    Median.x1 <- round(median(x1),2)1 T2 j" \; `! g
    Sd.x1 <- round(sd(x1),2)
    8 G  f3 i+ m0 ~/ w! kcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果1 v( m; C- m& o! y' e, P
    x3 <- data4$friends$ f, I4 b( ^" v6 B! m, e* k4 i+ K
    Mean.x3 <- round(mean(x3),2)
    , U. i9 F2 l- e7 BMin.x3 <- round(min(x3),2)
    + M* |- \1 |! M; bMax.x3 <- round(max(x3),2)2 @$ Q2 U0 W0 h9 r! K; T# @
    Median.x3 <- round(median(x3),2)2 J# O2 t. _% \& V  h% q( b
    Sd.x3 <- round(sd(x3),2)
    # L' P  [" E& F" u6 n  S5 e; hcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    $ j% d9 i* M- q5 G7 g' Oy <- data4$salary  \1 p( w) B, y. g( L' u
    Mean.y <- round(mean(y),2)
    ' l: x' ^% X1 |! U9 d5 [Min.y <- round(min(y),2)1 H: \/ d: D% y6 O+ h! o
    Max.y <- round(max(y),2)& \' B! B: I' O, @/ q3 W7 T
    Median.y <- round(median(y),2)* v& g3 F7 `' \5 ?
    Sd.y <- round(sd(y),2)
    + g9 S1 b: r  q" l6 s0 }cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果! o  K" Z8 R: G& }' P) p3 D
    2 N2 D& _) X4 [* P6 j+ k& j
    #6
    $ _! b* F7 ^% t' a% @1 ]2 V4 a#计算数据集中因变量和自变量的相关系数,要求保留2位小数。: _0 z8 L. J0 f) F3 ~7 x
    round(cor(y,x1),2) #y和x1年龄
    7 B; L8 K" a7 O) l% C. y! `round(cor(y,x2),2) #y和x2居住时间
    . N1 A* [3 |. ?1 ~0 xround(cor(y,x3),2) #y和x3朋友数量9 Q2 ^6 {; o2 J8 ^
    0 \7 h- W1 m7 {. H8 S, [
    #7# ?  @: }+ l; q0 d7 @9 d$ m! A
    #分别绘制数据集中因变量与各个自变量的散点图' o; H5 N- w  `* O4 |; ]' H
    par(mfrow=c(1,3)) #布局,一行画3个图6 P# c# l( r7 a! m( t
    plot(x1,y,xlab="年龄x1",ylab="工资y")# D) R( c4 M* b2 e5 P$ ?
    plot(x2,y,xlab="居住时间x2",ylab="工资y"). A% Y6 o( X! ^- j' a4 X% j% `
    plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    1 D9 a/ V+ j. j, s  K5 E, m. k! ]
    " q! V* U5 L6 a' B$ D; @#83 f: p( m& ?; Z/ Z) {1 ]: a
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    . h- E; H! r7 Plm.xy <- lm(y~x1+x2+x3)
    ( E  R4 g* J+ Mlm.xy
    , D0 O9 s& c- y* F4 S- t, s" @4 Y4 |5 usummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的$ ]3 q) v3 T# C# ?1 ~4 e& Q

    ) K, d  o7 L9 D. `7 |#9
    - I# `* Z& e! Q$ C9 B5 N& R, O  E#对#8中的多元线性回归模型进行诊断,确定异常值记录。6 M" t) ]! c) u4 p9 w
    par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
    / }4 ?# }( Z( h* k* E#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布$ a& Q" A7 M8 ^4 I& D0 W. O' ~
    #③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    3 i# |- c# t- Q7 ^- S0 U9 j+ j#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
    ' K( r$ I7 A0 |#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    / _& e! Z( _  \9 Hplot(lm)
    , |# _/ \0 X/ r3 q! m' D% _library(carData)
    6 H$ T5 j/ \) e5 w" g7 Qlibrary(car)
    + u+ l5 S) K; H/ F- s, C4 n6 FoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点: s  S! n: @" ^2 o" |
      L$ R/ a# O1 F& t: j  K) Q
    #10
    4 T; V# m3 G$ E4 T9 W4 A# T#删除异常值记录后重新利用多元线性回归模型拟合数据。
      q+ ^* }& ]/ Y! Zdata4 <- data4[-136,] #删除该点
    : u6 x  f0 o* U; |; l9 P: C0 bx1 <- data4$x1
    ! V" l3 q$ [4 t- F- j9 s6 ?x2 <- data4$x2
    / {% W" a/ N. jx3 <- data4$friends! Q% c* u( G/ z2 a3 Z6 ^
    y <- data4$salary' u2 M$ O5 a1 e8 Y5 s! Z) U
    lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
    : e  ?5 X% H( s+ W& [+ @lm.xy2, d, F/ \& g. n: u+ S
    & [4 U8 }) }; @, N0 H
    #119 t! C. g4 [4 E6 X: x
    #对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
    % t1 }5 T4 t1 P% uvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
      L* b( d8 g( s3 a6 \
    + m' s2 w( h$ p: M1 l1 C#12
    7 v/ {  n( h: \+ ]#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    % X9 X3 Z: ?# N9 O; z1 zsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
    . I" e# K1 v9 Q2 k
    # i& @. i: s: V3 O**********************************************************************
    " ^$ _) \1 b9 y8 o3 r6 e: E. O4 f9 x: o% |% P8 k
    二、利用多元线性回归模型预测收入3 X& @2 B1 G- A/ U- R$ O+ w* b: U6 c
    View(data4) #124条数据
    3 \9 c- C% J$ J, L' R. y) N6 x/ ^% F1 _#1
    6 w* x% \; o1 k#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。9 v' u/ |  N- ^1 U
    train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集  _% A7 o3 K5 B( O6 O1 l5 Y% a) E
    trainData <- data4[train0,] #训练数据
    ) A5 x5 R" _+ u* t$ |6 ytestData <- data4[-train0,] #测试数据
    : `2 }: H% D4 K" e$ Z
    0 A) x# }' P% F! S6 A$ T8 ?#2
    % ]2 _' x7 s/ f+ ]! q. V" @! b, x#针对训练集,利用多元线性回归模型拟合数据。$ g# p! y+ y/ B7 g6 q- i4 I
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])$ [2 W# f2 a, d
    * `. }% q7 ^6 P. {$ L: N
    #3. e: p. Z6 a1 u) V
    #对(2)中的多元线性回归模型进行诊断,处理异常值。
    $ _; X' m" P) m+ B) ^$ ~3 B- qsummary(lm.xy3)
    - L& p9 Z1 Q1 ?4 Jpar(mfrow=c(2,2))
    : e1 F7 Y* U) F* O  splot(lm.xy3)
    " C! w5 r4 r7 X2 N) ]outlierTest(lm.xy3)1 |/ E$ S; J% k6 e: A. N
    trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
    ) F8 n! N% D. V3 L+ V# k
    3 P) d6 O& e2 h7 y7 v- @/ R#4' Y& V9 B8 w' i! E
    #对(3)中的多元线性模型进行多重共线性检验并加以处理。
    ' `" i& u6 j' z$ h7 j$ Bvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)3 I, i* r3 ?3 T; r; g
    salary<-trainData[,"salary"] #引入的数据是训练集的数据; E' O/ W6 j) S2 R  {8 @
    x2<-trainData[,"x2"]2 D/ C- D  c) N' W  M" c
    x1<-trainData[,"x1"]! t2 h  r( O1 K& q
    friends<-trainData[,"friends"]& k9 V% K5 ?! w
    lm.xy3 <-lm(salary~x2+x1+friends); N8 I& `" z  D# i

    * x/ ^3 k9 o1 C1 Z#5  f* m+ H% O( H. \! f3 U* L
    #针对(4)中的模型,分别利用AIC和BIC选择最优模型。& d  l8 P. F6 X, C# X& o# p
    #AIC检验,赤池信息准则,选择最小的
    # P* \) I) L! N" U/ c5 a6 H2 aAIClm<-step(lm.xy3,direction="both")
    8 `5 U; F# x. l& z/ X#BIC检验,贝叶斯信息准则,选择最小的9 r4 X6 b0 J8 b2 i2 {! E- M
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
    5 C$ e$ i+ P( v, T. d% ?( k, S# G1 `7 a. A2 L; v$ n
    #6# {; H9 D* Z2 h0 N2 W, E  V7 ?1 x4 q7 ~
    #利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
    * d! t: b: E2 U+ G/ k5 ?#这三个模型预测的准确性大小,并进行解释。1 Q9 @8 k9 B" s' e8 Q/ I
    Allmodel<-predict(lm.xy3,testData). p% j  S$ y) _1 a6 X2 Z3 M0 K
    AICmodel<-predict(AIClm,testData)
    3 {; E" O  e% u* XBICmodel<-predict(BIClm,testData)1 e! ]' e  E+ w  d3 Q
    #均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    , D: F! i# p  }9 w( p2 H: ^/ I  |#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根: t4 j3 B8 l; G" C2 W
    #标准误差能够很好地反映出测量的精密度& e, s5 Z1 F3 t7 _# A
    MSE <- function(x){
    " y7 L6 t& a/ T" g) L& P7 j3 p  mse <- sum((testData[,"salary"]-x)^2)/509 f4 Z7 y% _' T
      return(mse)
    ) Q$ l8 R/ W/ }}
    / Y' x2 v; ^! eMSE(AICmodel) #AIC/BIC/ALL是误差最小的8 t9 a) \8 A/ H( T* X
    MSE(BICmodel)
    * n9 k' M0 t; YMSE(Allmodel); \1 ~: ~- o# L
    / [4 I6 e2 d% F/ E  {) Q, o
    6 t- g2 {8 O, q! J7 W1 [2 y" ]4 _

    8 V# ]: Y1 \* M2 K
    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-6-4 10:24 , Processed in 0.450823 second(s), 57 queries .

    回顶部