数学建模社区-数学中国

标题: 【高级数理统计R语言学习】2 多元线性回归 [打印本页]

作者: 1047521767    时间: 2021-10-29 11:44
标题: 【高级数理统计R语言学习】2 多元线性回归
【高级数理统计R语言学习】2 多元线性回归

一、背景: t$ V) ~# W% M0 z" `
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。

二、要求和代码

一、分析收入的影响因素' g. g( L5 U! y& |0 B$ n0 \% {& [
#1
* f* Y: Y- \4 O+ N#展示数据集的结构
4 t& G2 @; l3 Z* gdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
& W$ O7 f7 N) M* J# l( i: b1 Wstr(data2) #显示的结果有一列是多余的,需要删除
" U" g! P, w! ^6 h9 {. T' _1 Vdata2 <- data2[,1:9]
: l4 {7 p% D9 E) Q* Gstr(data2) #删完之后的显示效果是正常的没有多余列( A  R) d& N/ c; r

  p1 P0 e* ]4 V#2. k' F1 m2 O4 h1 _9 w  ~. d7 N
#显示前10条数据记录
3 u# Z: m0 W+ k& v  p2 g4 }data2[1:10,]! h8 _! x$ n& n! f7 F; _
) U) ]+ `0 X6 D9 B, l, }& Y
#3
1 b- B( i# x! E3 _' k. ^#将变量名重新命名为英文变量名
1 `; ^5 b/ w9 j/ i% B- Xcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
* V5 n9 L. p) @( p5 p/ dcolnames(data2) <- cnames
9 x( U; L- Q7 ~View(data2)
  O$ J0 C, x  \! P7 a  P6 }% U+ h
  e6 o$ [! }! \5 Q# t% j+ f) Y6 U#4+ R% Q: r; C% R2 N! b; J
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
6 u: d2 q! g* e) Yx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
1 N+ {+ S- o6 w4 i5 r#View(x2) #①先算出居住时间8 \% J! d, b+ A* f2 ~. F8 e% F
data3 <- cbind(data2,x2)" |- L$ r% B+ D) {" r
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条9 k9 T6 q2 x- F/ ^4 e: Q
list <- which(x2<=0)
0 [! M: Y1 V& ]3 Edata3 <- data3[-list,]. _/ N6 |$ }) I% V
View(data3) #删除异常数据后是125条数据9 g) ~! W0 Y* z$ ^
. f7 f% x6 k# e9 t8 r. J% A
#5
5 R* R0 Q# r; ^) l% ]1 K% Y#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。% P1 u/ y6 p; u
library(lubridate)7 C: k/ b# Q7 p) b& v
date<-Sys.Date() #返回系统当前的时间
$ z# Q2 ~$ d2 T, ?nowyear<-year(date) #提取年份- U- H5 Z% D4 F$ M7 _& A
nowmonth<-month(date)  #提取月份( U+ o& f5 [- w% i2 p! [
#View(date) #查看现在的日期( W' i3 L& u! Z9 p0 A' q
#View(month(date)) #查看现在日期中的月份
/ [3 q. m2 _2 v! H& cx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
3 f3 Q' o/ g* z! a8 w$ ~for(i in c(1:nrow(data3)) ){1 `( w  E6 {1 _+ R, a$ H5 i
  if(nowmonth-data3[i,"birthmonth"]<0){: y3 u( R7 q; N" g- H6 I
     x1[i,1] <- nowyear-data3[i,"birthyear"]-17 N5 V" m$ `* m" F
  }else{/ f! V8 I: D: M7 H) q
     x1[i,1] <- nowyear-data3[i,"birthyear"]
0 z  V2 \6 D  K" l7 A# |2 r  }
; n: ]: d$ f8 r. {! J3 y}: b: P0 m  T3 _+ [* \, v* z
#View(x1) #算出年龄x1,并加入到数据表中( J7 r8 a9 h; o4 w* g
data4 <- cbind(data3,x1)
3 E! |7 h& \) L4 X" MView(data4) #加入x1年龄变量的新表展示
; n6 [6 K8 C* Fx2 <- data4$x2
* G9 Y' e) A6 c% V: g. ^Mean.x2 <- round(mean(x2),2)( s6 O, N/ y& w5 Y
Min.x2 <- round(min(x2),2)9 f0 Z. ?) ~$ a9 u8 l6 J  }. C
Max.x2 <- round(max(x2),2)0 J* r: c9 t$ ]0 s2 U& B
Median.x2 <- round(median(x2),2)
- l$ O, @. C6 F3 L  m8 `Sd.x2 <- round(sd(x2),2)
, h: l, d9 E) g7 e) H7 G- Gcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果6 z) {; z1 S1 r
Mean.x1 <- round(mean(x1),2)
7 ^8 F' k% K2 B5 H+ T9 s% R6 ^# qMin.x1 <- round(min(x1),2)
( \9 L% b4 b$ n  v6 }Max.x1 <- round(max(x1),2)9 c- Z6 i! [$ \& B+ G/ M
Median.x1 <- round(median(x1),2)
, {/ g& ]; R% W. Y' cSd.x1 <- round(sd(x1),2)" y  s& n& P! }, e6 Q" u, \7 S9 y; C
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果5 Z: C, i% `# v& f; \8 G9 `
x3 <- data4$friends- Z# R# ?2 i6 c( G% \
Mean.x3 <- round(mean(x3),2)$ _6 u) u7 ^! ?; D8 `+ V
Min.x3 <- round(min(x3),2)& _* V$ j. f) d/ B
Max.x3 <- round(max(x3),2)
: h; f7 y% ]- D3 g2 X8 D( kMedian.x3 <- round(median(x3),2)
8 k# d/ G5 o' Q# @! cSd.x3 <- round(sd(x3),2)
0 R# b& z) [! S7 S7 b; i) _cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
& E( B6 \4 L" E0 G% Iy <- data4$salary
! n0 K0 `! v5 B; LMean.y <- round(mean(y),2)8 v! B5 h$ P$ I2 Q
Min.y <- round(min(y),2)! W" q3 L! |5 S! z6 ?
Max.y <- round(max(y),2)' A( ?& B; J, `5 b6 t% Z
Median.y <- round(median(y),2), \8 B4 ]1 ~) Z
Sd.y <- round(sd(y),2)
. O" b; n2 u! T' B+ l/ A4 gcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果* z6 H# l$ x+ Y$ u8 K
: T9 g& a) G# t
#6
3 N+ v9 Q' F  |$ x! }! k6 d#计算数据集中因变量和自变量的相关系数,要求保留2位小数。! v( r% o1 c. ~) S
round(cor(y,x1),2) #y和x1年龄1 W* w% H! \  l! c( e% }/ D. A
round(cor(y,x2),2) #y和x2居住时间
1 b" j' u4 C. \9 B- kround(cor(y,x3),2) #y和x3朋友数量+ f0 d# H2 A1 W5 U- r3 K

  o" O1 H1 e9 @#7' Q, D& F- g0 T( K8 k3 \4 ^+ M  H
#分别绘制数据集中因变量与各个自变量的散点图# P& Z5 z9 J' j( I8 A' N! R
par(mfrow=c(1,3)) #布局,一行画3个图' d/ W: J4 C  B! ]
plot(x1,y,xlab="年龄x1",ylab="工资y")
" H: L# m0 d: m1 X7 H( splot(x2,y,xlab="居住时间x2",ylab="工资y")
  h/ {3 O+ L6 f6 uplot(x3,y,xlab="朋友数量x3",ylab="工资y")- ~; F; n4 p5 s  _

, S8 `; ^7 m# B# \! @9 `#8/ g6 h1 i9 S4 G7 W$ ?- J
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
1 {0 B) a' C* }- R7 ]1 hlm.xy <- lm(y~x1+x2+x3), }; Z! {% x% W* _" t6 ?
lm.xy
! g4 k4 A, g2 K# U4 P! w4 O% Bsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
; Y2 C2 W1 x* l1 y2 F; d. w9 W9 ?" b, q1 V- z5 Z5 _9 f: [
#9! }1 [' p' Z7 c' c0 E
#对#8中的多元线性回归模型进行诊断,确定异常值记录。7 S) S' k% W8 m. D1 |3 T
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
6 z5 M7 l1 l2 }' p#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
. P7 `1 J6 O% p4 g#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
( w% P( d7 ?& c$ ?#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。% }; `4 x4 ]* v4 i% f# y( P) B+ }
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。8 B: \) r, s1 x% H/ u) I, }. ?
plot(lm)
) O0 I6 V$ a. [# _library(carData)# U2 U9 N0 F/ X/ K# `! ?: ~( _! i
library(car)
4 c* V1 ?( l( _  W6 goutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
- f  U' @, \1 B+ {
  e: j3 i( t0 k( K0 w4 A#10
, }% D7 O( H: O" p4 _8 w1 s; j#删除异常值记录后重新利用多元线性回归模型拟合数据。
0 E' `& C6 @6 n, l" @) a6 e) j' }data4 <- data4[-136,] #删除该点
3 b- \" d" {* [9 O8 Sx1 <- data4$x1" q8 @2 q4 u, u4 |" A2 `9 v& j7 s
x2 <- data4$x2. Y; m3 Q7 Y1 k3 r" t7 K& D1 a0 q% {6 z
x3 <- data4$friends* f9 P, \9 o0 Z
y <- data4$salary
7 y; s0 Z* @  _6 D1 a) S9 flm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
$ }3 ]) j7 [# P6 b) N2 l5 f6 k. Zlm.xy2. w4 w: i, Q5 I8 B2 g

$ v: U3 f* Y" N, M! G: t4 I: w5 G# @#11
! v! S0 A- Z, A" }0 O5 D#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
: y# n% }- v+ [5 n' Y* _' M% a( ]vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)7 E3 V7 p9 a# y. @1 h
& Q. f4 F: v6 x% I+ g0 Z4 z' c: X
#12
$ K) r% T/ v" Z/ }6 g#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。6 {+ B4 x/ v: N
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星  |$ e- w& K, ^8 T, q* q( K
: @3 z1 q; f4 Z* o
**********************************************************************
0 I/ ^( x/ ?% P
% E; f. |  S4 K- q, J/ G) B二、利用多元线性回归模型预测收入
9 b0 [5 ^+ y+ l) }  Y6 |' LView(data4) #124条数据1 a, `1 n+ C' t2 X8 U- ]# J
#1
- z# s1 ]! M# X& R, @6 C: u4 s6 ~8 x#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
  e# R4 g( @0 ]$ Z' i' Vtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
) R0 y" F( a& ^/ J8 |trainData <- data4[train0,] #训练数据
# M$ v7 U6 G, M# I- H! A0 ?, v% ftestData <- data4[-train0,] #测试数据' B: w7 X. y2 O4 N2 i, _- e/ R: E
' p  B' g- f4 H1 }. X* D
#2
4 W, k  a6 p2 H- U! x$ R7 V2 V#针对训练集,利用多元线性回归模型拟合数据。, h" t1 b! r9 W$ k3 `5 p# R
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
. Z( Y' B0 A; U! ?/ P1 G' B5 r; Y6 x) g
#3
9 A" z) ]/ c7 f2 Q' _#对(2)中的多元线性回归模型进行诊断,处理异常值。
6 v' k- B& s* a. z; i3 G7 u1 X3 w9 Osummary(lm.xy3)5 E- @5 j6 K: ]' k3 i, T
par(mfrow=c(2,2))
5 T$ K- y% O; ~0 a3 r: J! `' a1 }+ qplot(lm.xy3)
' c7 o; P3 U" I# u+ R: g* k7 V( voutlierTest(lm.xy3). X8 T( v7 y4 l! T& y& M3 A0 H
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的) j6 P2 q; ~! x
( g; t1 q; Q" |# S8 j3 M
#4' W! [3 i% e2 x# i
#对(3)中的多元线性模型进行多重共线性检验并加以处理。$ S5 a! e" U8 ~! w
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
0 ~) m# X0 R5 _% R" ysalary<-trainData[,"salary"] #引入的数据是训练集的数据
% C( v% o8 ?7 E6 ]+ j* Rx2<-trainData[,"x2"]
  X% v8 w  N; J) r9 ax1<-trainData[,"x1"]! t' a$ [9 p7 k: R
friends<-trainData[,"friends"]/ Q. q9 B+ {( H
lm.xy3 <-lm(salary~x2+x1+friends)
# v1 u0 N* ]# u+ g5 X) O; z+ ~5 J) `, n! H3 D& X
#54 a3 i" H2 C% [! F& R9 u& I* E
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。/ z9 b7 Z: T% _* K4 w
#AIC检验,赤池信息准则,选择最小的
! q4 o& ?4 P) e$ A! C& PAIClm<-step(lm.xy3,direction="both")# w$ E$ {: R- h/ N% ~* i/ L* r
#BIC检验,贝叶斯信息准则,选择最小的
% M. j" J) w3 G) g/ g( t+ mBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
# K  E. S/ H- m0 f) n' E9 w$ N) L5 z. I! N
#67 @1 \( f  x1 G( x! N+ Q6 H
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
' z6 F3 G6 r; J3 k/ d#这三个模型预测的准确性大小,并进行解释。* R3 V+ v& a. F3 i; B
Allmodel<-predict(lm.xy3,testData)
) G7 L+ O" G6 A3 R. ^AICmodel<-predict(AIClm,testData)
3 @1 l/ h! z3 R' wBICmodel<-predict(BIClm,testData)
8 l& d: g+ J' \6 z" |#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差/ _3 ?; t. O' G; V
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
( H' {" n" O3 o  A" F* w3 w0 l#标准误差能够很好地反映出测量的精密度
2 d7 P; G; U; N8 ZMSE <- function(x){! O% P9 E6 d; G: W
  mse <- sum((testData[,"salary"]-x)^2)/50) M$ N1 b( d  _3 u" `
  return(mse)" W) v7 Y/ {4 ?/ x& i: c
}& s' X/ U. Y4 |- h) {
MSE(AICmodel) #AIC/BIC/ALL是误差最小的
! i# D: ?' ]4 d' `( x' u2 Q7 LMSE(BICmodel)7 |3 t* S! w1 ^  u' o* |5 O
MSE(Allmodel)
. L% m6 M8 m$ \, D+ ?$ C7 i. \% e1 ]! u3 q$ H

0 ~/ f- G/ {0 I- U( H  v! x( c, A/ U

作者: 试试吧    时间: 2021-10-30 17:56
好,谢谢楼主的热情分享的资料
9 s& v7 z$ L" @




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5