QQ登录

只需要一步,快速开始

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

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

    二、要求和代码

    一、分析收入的影响因素4 Z$ F- g8 O) i3 B4 c
    #1
    - a$ l( c# e* Q* l#展示数据集的结构0 g, Y' M6 B3 z$ x% J
    data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
    6 d6 ^& Z& o4 L" mstr(data2) #显示的结果有一列是多余的,需要删除" @# B! Q+ B) U8 l# l  |+ N
    data2 <- data2[,1:9]$ x: k* f+ |2 h- \
    str(data2) #删完之后的显示效果是正常的没有多余列6 o" Z7 I$ u& S- l, d: C' O

    4 N' c# Y* L. b2 g#2
      q( V6 [! V8 c- q: ^#显示前10条数据记录
    # ~% G/ J# R3 |$ h* C# Ldata2[1:10,]
    6 A# s+ A4 p4 W6 w6 I: Q' ?2 r7 S; f
    #3
    7 M$ O! C  s# S3 _#将变量名重新命名为英文变量名
    7 D$ Z( a* p& t7 g) C5 h- k8 Z6 hcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
    ( f7 j$ w1 b% ~0 ucolnames(data2) <- cnames- F  h, q+ o7 ~& {% C* H/ C/ T5 _
    View(data2)
    3 ^. @. U1 J0 T$ m# ?6 L; H
    8 {! h2 Q9 `; [6 W* w; ^#4& ~  M: r( X( q1 r- N$ j
    #查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录* L8 s: Z: S( t* M
    x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))) i2 W. q4 }* D3 `8 o
    #View(x2) #①先算出居住时间) }3 _" l4 `6 j" B
    data3 <- cbind(data2,x2)) |7 c  v* m8 v: k
    #View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条$ n! C- T: M! P* M3 e
    list <- which(x2<=0). p. l8 }5 b( f. [/ U- V
    data3 <- data3[-list,]* N4 Z5 i% z- u6 x
    View(data3) #删除异常数据后是125条数据
    ' E6 ]/ y7 x0 c7 B
    / R& `  j3 X% f#55 Q  n" l7 i. c- _
    #展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
    " z' N5 k$ [5 f" {. clibrary(lubridate)
    ' z  U( e1 C# s) r( wdate<-Sys.Date() #返回系统当前的时间. W+ n* @5 ^- w+ q* e
    nowyear<-year(date) #提取年份/ f7 D& l% ?' U& J* M5 z& r
    nowmonth<-month(date)  #提取月份
    ) Z, ]* Q5 h" Z" [5 B8 H" @/ D#View(date) #查看现在的日期
    " \( w6 T- K0 X$ r7 J$ Z#View(month(date)) #查看现在日期中的月份0 u6 U) \9 p1 V' p+ B# N
    x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))  x3 r+ K: L( r5 a  H: h- _9 {
    for(i in c(1:nrow(data3)) ){
    & \/ S1 o$ U. j1 I4 }8 @, i5 F  if(nowmonth-data3[i,"birthmonth"]<0){
    , Y' J0 \9 {) J% ]1 K! G# L8 c: ?( T/ ?! ]9 N     x1[i,1] <- nowyear-data3[i,"birthyear"]-1
    4 o+ n. V& f4 u2 K1 j6 Y  }else{
    - C0 m/ F* u; \" k6 F( n     x1[i,1] <- nowyear-data3[i,"birthyear"]
    0 X0 }0 u4 k8 X: d- \3 A  }
    # {" J  P' j- H  @}
    - a3 D1 V! b5 Q5 r#View(x1) #算出年龄x1,并加入到数据表中. _$ X3 S+ F# s6 n/ M
    data4 <- cbind(data3,x1)
    ; o% p& `; x" S! T" Q) o! dView(data4) #加入x1年龄变量的新表展示& j5 w5 S6 A, Y  a3 H% n3 n) a
    x2 <- data4$x2
    : B, I, d; W: [; CMean.x2 <- round(mean(x2),2)0 _$ `/ F% T0 w9 G8 L5 i2 B
    Min.x2 <- round(min(x2),2)- j( k+ U0 v7 C: y
    Max.x2 <- round(max(x2),2)
    - S% }" o. |, n* [) t  S& KMedian.x2 <- round(median(x2),2)2 Z5 Y, l; K% I. o
    Sd.x2 <- round(sd(x2),2)
    3 K$ J& S5 c1 Ccbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
    - e1 W, T+ B9 H% ?5 hMean.x1 <- round(mean(x1),2)7 a1 Z; b+ J2 K- H% G
    Min.x1 <- round(min(x1),2)7 J, ^" p: f/ {5 R
    Max.x1 <- round(max(x1),2)
    * G0 O; o! n1 b. p, c' m' ?5 y. _Median.x1 <- round(median(x1),2)* @1 U; \* x' ~/ N+ C
    Sd.x1 <- round(sd(x1),2)
    % p: E  W* k5 N3 d; Tcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
    # M$ U8 ?# R& }) ]& L$ _x3 <- data4$friends
    9 m6 V$ {+ t- d: Q; O: bMean.x3 <- round(mean(x3),2)
    ) V/ A" R0 w3 J7 ?Min.x3 <- round(min(x3),2)
    3 a( I( N# @) jMax.x3 <- round(max(x3),2)* m6 T+ A# c' ^( }
    Median.x3 <- round(median(x3),2)
    % v% M7 p0 x8 L; ?. [Sd.x3 <- round(sd(x3),2)
    - w& v  [8 W# \: h# scbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
    & O5 M5 C9 g7 `+ C6 W2 Yy <- data4$salary/ c. m% R2 y& N, b
    Mean.y <- round(mean(y),2)
    5 h. k0 Q/ G% o8 z" ~* GMin.y <- round(min(y),2)* _1 G$ I; i: e. z( G$ ?& L
    Max.y <- round(max(y),2)1 m7 @9 o+ T# C. ?/ q7 g, J
    Median.y <- round(median(y),2)9 v1 t, b- v. W9 c! R$ @. K
    Sd.y <- round(sd(y),2)
    3 C* z+ A& ~5 ]5 X  Tcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
    5 o/ y; ?. I* X( Y8 l* w: n/ ~1 S0 ^* n  z/ |& S
    #6. K7 P. F* K1 Q2 m' X
    #计算数据集中因变量和自变量的相关系数,要求保留2位小数。( o3 H9 I! r& M- D/ d
    round(cor(y,x1),2) #y和x1年龄. l5 h# R' ]) d0 L
    round(cor(y,x2),2) #y和x2居住时间
    9 n, M) a8 r4 M/ Yround(cor(y,x3),2) #y和x3朋友数量
    # q0 ]7 ]  B9 X! B' {% Z- c' H$ ~: z: f2 R. y
    #70 U1 t$ T9 l" H
    #分别绘制数据集中因变量与各个自变量的散点图
    3 ~( ~- S  v  D, ?, bpar(mfrow=c(1,3)) #布局,一行画3个图8 Z" c3 X- U5 `' }' Z
    plot(x1,y,xlab="年龄x1",ylab="工资y")
    1 D- V& F% a  dplot(x2,y,xlab="居住时间x2",ylab="工资y")
    . v3 m- q  D7 a7 @plot(x3,y,xlab="朋友数量x3",ylab="工资y")
    3 k' d+ F8 j: o( \6 I2 n/ J' ^+ Z( |6 K0 E& Y7 b1 N/ m
    #88 v" M& H# O% \5 h, h$ ~
    #利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
    / g3 S) n0 u" j  c# Y, v3 llm.xy <- lm(y~x1+x2+x3)
    / f5 {6 a/ @% S3 g" |& I( D+ Klm.xy* `1 G+ n# f' x
    summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
    8 U3 w, ~3 {# Z9 U( J$ ^$ r2 d3 W3 ?0 i# l# v! C# @1 \; I4 r
    #9
    " s" v' h9 U0 C$ r) i#对#8中的多元线性回归模型进行诊断,确定异常值记录。
    . n. k* W3 P( B2 N3 T4 V! Mpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列4 T2 w  F3 u8 P7 ^5 Y
    #生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
    0 Y% p' o6 y8 ]  j$ g#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
    - X, Z4 a# R$ U# o5 F: R) b#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。2 i# ?9 i9 T$ m  K
    #④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
    ! c& m4 w( N# I4 a! j) a/ iplot(lm)& s6 q6 E8 K% [  c, R6 m
    library(carData)
    2 H' d& H, g! q# v6 @library(car): O4 h7 u" J* t4 \
    outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
    4 s9 i  v7 _! h9 J( p4 C9 E& e4 M. H9 B5 \4 t; s' ?" A: o
    #10# D5 Q" V2 p( \, c7 ]
    #删除异常值记录后重新利用多元线性回归模型拟合数据。7 l& F2 x! N" w
    data4 <- data4[-136,] #删除该点# u% N) c9 T% y# O
    x1 <- data4$x17 x+ J1 K  m6 U- l6 p
    x2 <- data4$x2# x& v4 |# V6 v, `
    x3 <- data4$friends' Y% J! [: j% Q$ j' M
    y <- data4$salary
    / ]1 X+ ^' _; f5 G/ f% U$ j' ^- mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型$ W/ o" u8 v9 i( L
    lm.xy26 y- D( U6 l/ {9 N. e+ H
    ! |9 J% N6 Y8 @. j! K
    #11
    0 f- e& U, O4 z0 Q8 V" i' \#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。& N; S% U0 F* G2 `. g* _
    vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)$ H: ]/ Y) A2 x. ~) w( W( F
    : \. |1 U* ]& e# K* S
    #12$ t8 M: i( N1 C6 f8 z1 V
    #对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
    $ J( F" a# l! |+ T0 a% ssummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星, W9 c$ e/ W& i

    ' J, ?' Y! \4 p+ H6 w**********************************************************************# r/ O& ?/ q9 r

    8 S8 n- y' B6 w+ M) R0 n: [6 w二、利用多元线性回归模型预测收入" I) T: ^, C: _8 h% X. O# l3 u1 }
    View(data4) #124条数据
    9 h. J" i* J2 ]% g' u' A: W; h3 |#1! L2 f9 b7 E6 B- Z
    #从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
      M  m) U, F/ D! @8 v6 C6 x+ E7 ntrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
    9 G2 A& ^2 U5 X' T3 }9 ^) htrainData <- data4[train0,] #训练数据
    7 [5 a. l1 J7 h  M" G4 YtestData <- data4[-train0,] #测试数据
    ' Q/ |9 \1 Q! s! k
    $ V( M4 E# r1 [, N#2
    + Z! p* H7 e! B#针对训练集,利用多元线性回归模型拟合数据。5 u7 J# Q; y1 v& P) o
    lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
    7 m, }0 T% Y( M& W
    3 D0 S. T/ W; ~! ^! k# w#3( c0 J9 j, g" D* x/ i
    #对(2)中的多元线性回归模型进行诊断,处理异常值。$ `& X0 Z6 v, {0 j! t8 F
    summary(lm.xy3)3 C  q! q7 o# G7 @  o
    par(mfrow=c(2,2))- N5 [* Y+ m* m, k8 x$ i
    plot(lm.xy3)5 E9 Z9 G- t0 c
    outlierTest(lm.xy3)
    " c9 Y$ m1 r7 h! F2 u4 `trainData<-trainData[-c(150,32,82),] #删除异常值,随机的* I3 ?4 [( u! y* e; a
    ) P* Q" _/ E. |4 p$ s* S2 n
    #4
    1 w5 i- n4 A( e. U' w#对(3)中的多元线性模型进行多重共线性检验并加以处理。
    . q" }3 i  H4 |% N9 ]2 nvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在). O/ R: O8 w! A- N0 T5 z, E0 b3 h
    salary<-trainData[,"salary"] #引入的数据是训练集的数据
    ; |6 t. ~1 E7 X/ C1 t3 `5 _x2<-trainData[,"x2"]
    ) L9 ?" m2 a  Vx1<-trainData[,"x1"]5 N# Z" q4 f0 w$ d
    friends<-trainData[,"friends"]- c2 Y" f* O( g9 J7 Q
    lm.xy3 <-lm(salary~x2+x1+friends)6 y! L6 j* k) n# u& t" m& p- g

    9 i) T$ O1 J( _5 M' t#5
    / C0 j7 P- I) r/ {7 s. x& H#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
    ! O8 g$ t5 b# r5 U( Q#AIC检验,赤池信息准则,选择最小的, @5 j. [- W. B- H# ~
    AIClm<-step(lm.xy3,direction="both")
    9 L1 k3 w' N# A#BIC检验,贝叶斯信息准则,选择最小的7 S! T; \6 ^* M) [% B' F
    BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both"). H" ?: N" A6 n8 k  w) W$ v- j

    + F6 Q" G( S, y5 t+ K& R% ]1 H#6
    & t) \, q/ d8 G, J3 X! y2 n#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型0 I+ Z- E) S5 ]5 l9 w
    #这三个模型预测的准确性大小,并进行解释。
    * k  G$ x, k( T4 `0 x+ R0 J7 |+ i+ u/ NAllmodel<-predict(lm.xy3,testData)
    / j! h4 K9 P# k% P. |AICmodel<-predict(AIClm,testData)
    . P$ N* E8 e8 R+ `0 z" eBICmodel<-predict(BIClm,testData)
    1 l1 t  F  r( U3 H#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
    8 z: _, s9 x' ]' j" ^#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
    / @( Q! B3 }$ \4 Z- Q% a#标准误差能够很好地反映出测量的精密度
    ; U; N: |% b" c0 p7 HMSE <- function(x){
      J* f" w5 a2 N4 |5 [' m8 r  mse <- sum((testData[,"salary"]-x)^2)/508 G9 f1 F$ i: J
      return(mse)
    " h5 ~- v+ N+ w}
    ( ^8 V! X, t3 ?4 D; ]" M" nMSE(AICmodel) #AIC/BIC/ALL是误差最小的; f% X$ k" H& [6 n$ t- D( i
    MSE(BICmodel)& |! u& }, }1 k: z
    MSE(Allmodel)# D8 L( W* {! F' _# c/ v

    # _7 q4 P* \* }9 z+ }; d/ u7 \. V. h; P' }. [. Z
    : t: Z. F9 M& x$ T5 ^" w2 ^; P
    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 11:59 , Processed in 0.481241 second(s), 56 queries .

    回顶部