数学建模社区-数学中国

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

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

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

二、要求和代码

一、分析收入的影响因素
" N1 u' a1 a  Z' n' o7 ?0 K3 |, O#1* a* `8 r2 e7 u9 z
#展示数据集的结构; B1 m. s% G2 M! r
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
7 ^) ?) E8 s$ i4 q" k, Cstr(data2) #显示的结果有一列是多余的,需要删除
4 g. o/ O8 {2 [5 X* }  w9 edata2 <- data2[,1:9]3 u6 W: d  K/ q/ l7 e8 Z, l
str(data2) #删完之后的显示效果是正常的没有多余列
; m% c: i9 h4 Z$ s! R9 U/ [
0 M! S. O# V. L* }. O& m6 E#2) }& i- g2 y( M/ V% K
#显示前10条数据记录
! X5 N: a" F# [data2[1:10,]
6 @- E; a4 M8 ~) `- u% k/ C/ \8 y/ z7 ?7 H
#3/ I& |% K7 N8 \: D% I( }3 I
#将变量名重新命名为英文变量名  }( {+ P. Q( s
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")% n; P, `, ]* F$ Z5 s6 I8 }
colnames(data2) <- cnames+ R4 s" D( F9 l4 Q* R$ {
View(data2); q* a0 F0 o0 P' K
2 |$ }; q4 q+ b1 o5 U
#4; V& ~9 |% W+ U. q( @
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
6 F$ O4 k  S, I* D5 P# s2 W" rx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))* C& N7 w8 p) x4 f) `6 ]7 z7 N
#View(x2) #①先算出居住时间
5 r0 }; A0 h; l! P8 @  Idata3 <- cbind(data2,x2)
5 m9 g- I$ n& q" B7 n0 d# R#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条8 n) G* L/ q2 ]
list <- which(x2<=0)- J  m+ p. F4 V: k7 s
data3 <- data3[-list,]% M9 B' O7 I, i
View(data3) #删除异常数据后是125条数据' z- Y  ~% V% S! ?
. _6 K4 w1 `8 H& q/ t. _
#5
, X' W* }1 P& R; {. P#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。' j) C) w7 P# B; L
library(lubridate)
3 n$ @9 l3 i' {( S) ]+ }$ {4 d# _date<-Sys.Date() #返回系统当前的时间! ?# q" a- _+ P
nowyear<-year(date) #提取年份1 D2 B  v$ {' n, I. F1 N
nowmonth<-month(date)  #提取月份
! {' U, p# y9 z#View(date) #查看现在的日期
" H, D4 \8 q4 v  Y#View(month(date)) #查看现在日期中的月份1 y2 E9 e  \6 s& d9 E/ H% Z  G
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))- }5 `3 ]4 i  V
for(i in c(1:nrow(data3)) ){
9 Z( ^+ z0 J' j8 @) }+ Z. U  if(nowmonth-data3[i,"birthmonth"]<0){! n9 V+ |+ o# T' X
     x1[i,1] <- nowyear-data3[i,"birthyear"]-18 ?( o' u% ^* H2 i3 j
  }else{
2 n1 T+ H, b& X- y! ?     x1[i,1] <- nowyear-data3[i,"birthyear"]& X, r2 j; I, k, i! p
  }
2 @( I; a' I$ k; O$ {# s}
, }# d7 u6 S+ K  V( j#View(x1) #算出年龄x1,并加入到数据表中" j* h1 O) [: ^) T% H% I. S
data4 <- cbind(data3,x1) 0 C# F0 g- ^& I
View(data4) #加入x1年龄变量的新表展示5 Z+ L& {0 o2 k- w: w" ?0 d/ I
x2 <- data4$x25 C8 F3 b- f& m# C1 P: |% i
Mean.x2 <- round(mean(x2),2)  c8 x+ k; h, y- Q$ f( A8 \' F
Min.x2 <- round(min(x2),2)
4 f- F* V( m9 V6 bMax.x2 <- round(max(x2),2)
. ]3 J$ s/ p& K* ~4 c- L" zMedian.x2 <- round(median(x2),2)
2 Q. m- B+ P; s- P+ e/ m: H. o8 HSd.x2 <- round(sd(x2),2)
, r: {- V/ c" z1 R2 F$ c" G3 fcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果. X2 F/ @6 f# l; r7 X" ]
Mean.x1 <- round(mean(x1),2)
5 S" g, B, C$ _6 ?- J5 tMin.x1 <- round(min(x1),2)) W6 Y1 M; D' K( Q# [" n
Max.x1 <- round(max(x1),2)# e' ~4 l( @# |6 v/ s: r
Median.x1 <- round(median(x1),2)
( w2 w; ~1 w  I0 K5 gSd.x1 <- round(sd(x1),2)8 a- p* ?3 J8 E8 D
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果3 R* @8 h3 d) j, C% Y5 s" A1 w' D
x3 <- data4$friends. N5 d. d, v' n. P/ f4 \
Mean.x3 <- round(mean(x3),2), _) F% P" T8 Y, k$ K2 T6 c1 `6 x
Min.x3 <- round(min(x3),2); c6 y- W1 m+ |
Max.x3 <- round(max(x3),2)! h( s, H% K: N6 [& F
Median.x3 <- round(median(x3),2)
- ~/ C4 j. G: ]7 |0 ISd.x3 <- round(sd(x3),2)
, C6 N2 K% t; Y& Rcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果7 l' m* `0 X: F
y <- data4$salary1 O6 K( B' k3 U5 o! B1 y  @/ ~* F
Mean.y <- round(mean(y),2)& i: e8 b% ?) |. i0 B# v: K& R
Min.y <- round(min(y),2)
! y1 w1 ], T7 O6 c3 gMax.y <- round(max(y),2)5 |. Q$ M; ]+ D' n& D4 y
Median.y <- round(median(y),2)* `# d: F, M& z7 `; s
Sd.y <- round(sd(y),2)0 B* s* q$ Q$ h! q' Y+ h4 ?* {
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果+ k* Y5 Q! G* m3 G# T
; J/ D9 a3 a+ B9 @7 l
#6
3 p5 R' |) |3 s# E2 e6 ^1 j- B1 W#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
7 W0 a2 f" Z, Q# C! C! [round(cor(y,x1),2) #y和x1年龄
! K8 M: d' I: k$ [$ Mround(cor(y,x2),2) #y和x2居住时间
" s% R1 k* h+ g8 N7 k6 ]. Y2 C4 xround(cor(y,x3),2) #y和x3朋友数量4 B. k1 k3 L! v5 w  G
7 p. j  d" k1 e' L) ~& K1 b* x
#7
% x# `% j; Y5 ^, d#分别绘制数据集中因变量与各个自变量的散点图
+ J) l6 s7 S1 ~  K4 ypar(mfrow=c(1,3)) #布局,一行画3个图0 O9 R2 G7 V8 j$ C
plot(x1,y,xlab="年龄x1",ylab="工资y")
: R6 q; N5 U  o% l8 W1 X8 ]plot(x2,y,xlab="居住时间x2",ylab="工资y")- d$ b6 h) R9 |3 f2 W# A7 M
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
3 p" K" @( D3 i- `$ J2 G  z' G$ ~" q# [% b! b3 U7 h
#8# Y/ ?) d; T+ M$ o2 J
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。" A8 x( {5 `/ n' D/ T1 d
lm.xy <- lm(y~x1+x2+x3)3 k& P8 f  _6 U. q) g0 q
lm.xy
) X* b8 v& G  q6 u( B& c* asummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
) B2 J: K+ \7 _, `# Y
; C/ @3 r  I/ h' \& `#9
' o! E' z* Z( k9 p% t#对#8中的多元线性回归模型进行诊断,确定异常值记录。
+ T9 f7 Y: P# T: j* W5 g( _par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
$ F: |) r. N) ~#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布2 O  B9 r7 f! z, H/ _
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。! W% N% S5 {! X# ]: c
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。# K( S4 H$ i2 S" M
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。2 [2 G/ v( B& }, ]5 u
plot(lm)
  ~( J: Y1 s9 I3 _library(carData)" @  `% s, d- i5 r" t
library(car)
! x  M' ]: N  C$ D2 moutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
( e, d+ k3 E1 F1 ^. {9 i* U
- R& w6 ~. D9 ]( J- ?#108 L7 u/ q1 ^+ l1 s0 ], Z: O. d
#删除异常值记录后重新利用多元线性回归模型拟合数据。# ?5 S5 z1 n4 e* d
data4 <- data4[-136,] #删除该点$ k7 s7 T9 U$ Z( E3 p( Y" `
x1 <- data4$x1
4 K4 ?5 t$ D: {x2 <- data4$x2
8 p' C0 ]/ `5 \* F8 J0 Z% Zx3 <- data4$friends
% e" E3 J7 D. j# L  ]  a3 Ay <- data4$salary
" E4 }& Y! ^$ J2 g, q- y8 E& Clm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型/ m5 J6 w9 l2 H* U
lm.xy2/ u( y2 [, ]. M+ n0 {/ w; z) H8 G
* O2 N/ s% P$ C. C2 Z: L: w9 F! n
#11+ v6 X" {% c2 e; P* L4 ]9 l/ d, b
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
+ Z, N2 Q7 F4 V% b3 Cvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
* E; I0 |& f$ O0 o! b' s
  o7 J1 s0 Y8 U& P, D/ C#12
  [( R" ]* _8 x! B6 K#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
. p$ b5 d0 P* M8 _/ L) Asummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
6 @& j# Q. X1 |2 t
  s  k/ z/ U8 w, G# T**********************************************************************
% z+ I) r' \# P' ^) B& C0 j# V2 _( M  ]- W* g7 S5 [+ E
二、利用多元线性回归模型预测收入
1 j3 o8 |1 G- M7 \View(data4) #124条数据
# u& k& J( o: d#11 L9 _: E0 q% `8 Z/ M2 q
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。8 K( o7 X7 l+ F% `: n, \
train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
3 o. [0 Y( d0 ]1 K3 R, ~& _trainData <- data4[train0,] #训练数据3 k; f- ~2 K$ I. j- S, n0 ^0 s
testData <- data4[-train0,] #测试数据( k+ T1 \! u4 T$ {

" i  Q/ t, W7 t( @/ _# d#2/ B; C/ X0 T3 {8 M- t& A* C; [
#针对训练集,利用多元线性回归模型拟合数据。
+ z/ d4 f$ g% [% {: E% \2 ]# [lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
( {4 ~) y8 k0 w: ?2 p! P7 R5 `4 r6 L" w7 V. L% l& a2 |4 S
#3
6 v9 M! p( u3 t$ U9 ?#对(2)中的多元线性回归模型进行诊断,处理异常值。, f$ Q6 V3 s1 f# N' ?$ y# x* I
summary(lm.xy3)
# e$ J0 W% N! |$ R! o( bpar(mfrow=c(2,2))3 @  g4 z$ \, P" a
plot(lm.xy3), @$ X, a' l9 A
outlierTest(lm.xy3)
! K0 M5 ^0 r2 y4 ctrainData<-trainData[-c(150,32,82),] #删除异常值,随机的0 o% T6 s! {1 e! y$ W
: N% m' W% i+ d% r
#4
9 ]! L, @, [! E#对(3)中的多元线性模型进行多重共线性检验并加以处理。2 }2 g% a3 l" }6 r
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
) o2 o5 _7 X# z  Psalary<-trainData[,"salary"] #引入的数据是训练集的数据
% |3 b: c' T2 ]0 V/ `) K) Ex2<-trainData[,"x2"]
2 x: w( _! m% U! ]& ?1 }7 Qx1<-trainData[,"x1"]
+ N1 x7 z: @8 ?3 ^friends<-trainData[,"friends"]
7 N% `( K( g5 O) d7 v: ~6 w9 `lm.xy3 <-lm(salary~x2+x1+friends)
" x9 O" u$ o: i4 ^6 Y+ f2 L" t
#5
5 p4 A6 N) Y6 \  j  U' n#针对(4)中的模型,分别利用AIC和BIC选择最优模型。2 P/ X. t( c* m" ~
#AIC检验,赤池信息准则,选择最小的
; _* v: @2 L) s# o0 k0 _9 FAIClm<-step(lm.xy3,direction="both")
2 `% D; w) w$ x#BIC检验,贝叶斯信息准则,选择最小的
# e+ F7 q4 n# R2 @BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
, z* W, ~, W! S! U- }/ l8 j7 M8 ?- `# x3 J9 G  S$ b
#6" Q; P( o$ m; g1 k
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
' ^! e+ M2 K" Q) l& h9 d6 s* n#这三个模型预测的准确性大小,并进行解释。$ H" j: r4 o, T% ~' R
Allmodel<-predict(lm.xy3,testData)
3 ~  J, |7 ^3 t' y' e$ ~1 cAICmodel<-predict(AIClm,testData)' f7 w0 M# Z% H. N" s& j$ }9 ~
BICmodel<-predict(BIClm,testData)
7 ~- a& v8 h/ d2 B" _$ `#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
4 j2 p+ C) c9 M2 {+ b#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根/ Z: M: R  v! P3 O! h
#标准误差能够很好地反映出测量的精密度2 c1 R0 N, _4 V$ o2 G
MSE <- function(x){
. M. Y% w3 |$ ^8 V  mse <- sum((testData[,"salary"]-x)^2)/50
7 r# v2 l- w, s+ l9 M) R  return(mse)
# {# t. A' j" N. Q  x}: q* C1 W9 r5 p5 @1 I
MSE(AICmodel) #AIC/BIC/ALL是误差最小的
7 @( y& {$ d) n' P  h7 a( Z; \( TMSE(BICmodel)+ S5 U2 `6 B$ ]' g5 n8 j7 V
MSE(Allmodel)& w/ ?0 J+ f  O7 D+ @- m
* J7 g% @  {. a1 f

7 ?. ~9 n" t# J- o" x* G$ X5 G" L- K4 w* ]2 @. R

作者: 试试吧    时间: 2021-10-30 17:56
好,谢谢楼主的热情分享的资料
5 [$ t6 ]# R& B  Z




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