数学建模社区-数学中国
标题: 【高级数理统计R语言学习】2 多元线性回归 [打印本页]
作者: 1047521767 时间: 2021-10-29 11:44
标题: 【高级数理统计R语言学习】2 多元线性回归
【高级数理统计R语言学习】2 多元线性回归一、背景; W! n0 ^+ E) O
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。
二、要求和代码
一、分析收入的影响因素4 l5 O* K# p2 D( e% O
#1
) [0 s) H v5 P- y#展示数据集的结构
+ j) B! r3 Q; r0 edata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")" p" B) _' t' [' j# N7 n
str(data2) #显示的结果有一列是多余的,需要删除: |& D6 X' ?- x
data2 <- data2[,1:9]
2 f) L* I8 z% nstr(data2) #删完之后的显示效果是正常的没有多余列0 ~2 h+ N( _. A1 Y1 ]" X+ _
- z8 n2 d, o8 B#2) a" Q$ c9 U1 e( f S4 w- W
#显示前10条数据记录
% P& z( ]! i' B6 Tdata2[1:10,]
, X3 U0 V; S! T0 B$ S) \0 Q( W. B, u: q3 B
#3
# S6 U6 L7 _- }# S* h7 \#将变量名重新命名为英文变量名% A8 W' p* P% R' `$ ?1 I/ M6 H
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
, i, T4 Q' Y+ e; M0 D- a6 |% v" `* c9 ]colnames(data2) <- cnames
/ i: S9 ~- s6 mView(data2)
/ f" \, a& z) q# y- R% M% f2 F, W+ u) ?* |2 t) Q
#47 \( v) R' v" M
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
6 l; u; _- z" ax2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))! L+ `+ _2 G( p
#View(x2) #①先算出居住时间
* i) Y+ e3 m) F* W G' Bdata3 <- cbind(data2,x2)
# E$ y1 }; o3 a2 n' A c) r, G#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条; |2 H' P- y2 s
list <- which(x2<=0)
9 l7 @1 g* ^6 f' ?6 ndata3 <- data3[-list,]; @$ ~+ I' D: u# h
View(data3) #删除异常数据后是125条数据' N/ B7 `8 q' Y( q5 D) \9 e
( F1 l% V- c! E" E' ^. a- ]. O
#5$ J- [+ Z9 N) z+ F& `/ `
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
! d( y6 P, f" x8 U- m; h4 O2 Z, Tlibrary(lubridate)
' N6 o1 l; e7 }, z% N+ kdate<-Sys.Date() #返回系统当前的时间/ \7 b2 R6 @0 ^) u D
nowyear<-year(date) #提取年份
, C% U- O' j: U+ V9 w6 x( ]nowmonth<-month(date) #提取月份- a6 G+ y2 F7 z( f. b$ h- a
#View(date) #查看现在的日期
7 s; O0 X. E8 k8 f" Q#View(month(date)) #查看现在日期中的月份+ w/ h- e3 ~% n. P2 ~5 R$ ^
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
: A. a4 l$ O: ^5 f7 _$ }for(i in c(1:nrow(data3)) ){2 y! M7 v9 e6 l J) G& Y& p3 [; o
if(nowmonth-data3[i,"birthmonth"]<0){' w8 F2 O* ^) T6 p Y1 U" n
x1[i,1] <- nowyear-data3[i,"birthyear"]-11 G% ~# t4 h0 E% d4 I
}else{
. S5 H: H5 R% n7 k+ E x1[i,1] <- nowyear-data3[i,"birthyear"]
* L( _0 x! d: {2 I3 C w, n }' P) I q, \8 y4 q' B
}
; T6 I! Q. F5 ^) T#View(x1) #算出年龄x1,并加入到数据表中
: u2 I; I6 \0 x: |data4 <- cbind(data3,x1)
# K5 y8 y1 @/ Q3 R8 A W' @View(data4) #加入x1年龄变量的新表展示
. ]7 u/ y6 { ^x2 <- data4$x2! u1 _3 b8 ^0 t: C; Z3 s, @7 q* m
Mean.x2 <- round(mean(x2),2)
4 R: S$ W- |7 \& ]6 R3 h; U( VMin.x2 <- round(min(x2),2)
; l: k4 H( Y) v! z8 E- h' |& {Max.x2 <- round(max(x2),2)5 J* H$ [0 H% Q* u k4 p2 ]
Median.x2 <- round(median(x2),2)
4 |% Y5 V7 c! v- G1 V+ s9 f& XSd.x2 <- round(sd(x2),2): h7 o; R' E2 n! l+ N) o
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果# e- D. Y- M& M. j9 x- r
Mean.x1 <- round(mean(x1),2)3 o0 o" ]' d# T8 k$ K
Min.x1 <- round(min(x1),2)
o# _/ i7 x. r& |/ v2 D9 T4 v% SMax.x1 <- round(max(x1),2)" G( a8 A0 D3 O/ B" C
Median.x1 <- round(median(x1),2)& O. y$ n" ? E- N- r% E* ?4 s
Sd.x1 <- round(sd(x1),2)
0 o/ p+ i R* \. Bcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果. j' V: W. q5 s8 G
x3 <- data4$friends+ d4 t8 F$ s* {# f6 e( {
Mean.x3 <- round(mean(x3),2)
& a7 f. ]) I, f. f. I, B! SMin.x3 <- round(min(x3),2)
6 ?+ o' t- B! t3 x/ VMax.x3 <- round(max(x3),2)( N. W9 B8 |% ~9 I/ _
Median.x3 <- round(median(x3),2)
. M K) z; V$ \$ ?" Z& ^4 b& P7 wSd.x3 <- round(sd(x3),2)
' m+ L, m! A6 b& T3 E1 u& h3 Ncbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果5 S" k& f) F4 Z) P! F
y <- data4$salary$ Z. y1 y% l( t5 l2 \& s0 P
Mean.y <- round(mean(y),2), Q, p5 |3 q7 s& V. l/ j2 H1 R
Min.y <- round(min(y),2)* G& r. d* y5 s4 U
Max.y <- round(max(y),2)
) e! O6 |5 M; Q. i) d7 F! mMedian.y <- round(median(y),2)
" j; A# t8 H- [4 tSd.y <- round(sd(y),2)3 V4 \' r7 [, t* A) ?
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果$ a% q9 h2 R8 v& U. d; J; d: R
- g* y, c3 k* I8 n i#6
6 E( l' }# m0 P#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
2 ]/ C4 O5 Y, l! T' u. zround(cor(y,x1),2) #y和x1年龄
! @7 P: [0 [# ^+ E4 C# zround(cor(y,x2),2) #y和x2居住时间* I( {/ K$ @) \, D+ n6 f% K
round(cor(y,x3),2) #y和x3朋友数量
) i" j2 J6 k8 T6 J: a4 d6 ?0 ?- }: |% n
#7 ^ ^( f! Z. g
#分别绘制数据集中因变量与各个自变量的散点图+ ~0 I. c9 G: |0 b( U
par(mfrow=c(1,3)) #布局,一行画3个图3 ]$ @2 Q' u7 p
plot(x1,y,xlab="年龄x1",ylab="工资y")
+ R: E- X- u E1 Zplot(x2,y,xlab="居住时间x2",ylab="工资y")( H+ c1 D! J: ^* U# r& u* i
plot(x3,y,xlab="朋友数量x3",ylab="工资y")) d: m* O$ K0 y& }& Q/ T- K
( J6 m: J! d W. v* n! c; G3 \#8
' R( f5 a! _0 ]8 ]1 K#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
7 }) k1 \# K: ^, t4 J7 clm.xy <- lm(y~x1+x2+x3)
6 n/ \7 d! D6 X/ I1 P2 Olm.xy
+ w" x% [6 d. }! Ysummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的( V1 `& S' ~' S. f
8 O& ?( B, \$ r/ u$ K#9/ p6 C& P# ^3 U# o" P: S
#对#8中的多元线性回归模型进行诊断,确定异常值记录。0 m" M$ I, D4 Q0 F& \
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列% ^8 _( q% }, J. I t8 k7 Y
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
' w' v# j; E- g# ~#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
- {& R6 V' ~- L$ `3 _8 W9 S) x8 @#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。- ]/ O% x. K2 r& l4 P
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。: v$ W2 ]) q( S: x, e
plot(lm)
; U0 u9 J, I7 ~6 _library(carData)3 {+ m& Z! J- C
library(car)
+ p2 h5 d! w# a5 [outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点. i, w2 o9 K$ v" H" L: j
/ x4 p; u) G Z; C1 A! q#105 ^( z9 z) p2 |) G1 a
#删除异常值记录后重新利用多元线性回归模型拟合数据。' L* E0 `% F( \. W* P6 d6 r; b
data4 <- data4[-136,] #删除该点
: b0 N' m7 U( O# dx1 <- data4$x1
; }: R8 _* [2 S2 y& h/ p qx2 <- data4$x2, q7 k6 y2 y) a' s; a
x3 <- data4$friends5 H9 y8 ?) _: t. ]* [
y <- data4$salary
}+ p% U# ]& Slm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
* I& d8 x% p/ b @lm.xy2
6 m: K. i. b" x/ X5 f- h: T7 k; G$ f% C9 I& Q$ I3 ]! u
#118 W+ [; [) N9 P, T
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
/ g5 B: T9 ^7 W% K ?* jvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
/ G0 O1 r# q% o/ X( x9 T- f0 _. ~! s3 x( M7 P/ E
#12
: e- I8 Z8 m# P* O5 w! |#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。/ |( C1 m: w/ f! `$ M) J
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
1 ^- G9 c) x2 l6 R# W% T1 T i8 |' s2 b
**********************************************************************
9 H. q8 v. S& Q. Y: z, @6 G
# x; ?" T" b- ]7 ]$ V二、利用多元线性回归模型预测收入# ` Y) p6 [: Q9 a6 O. m
View(data4) #124条数据! Q9 j8 s' U9 L1 v, X: r
#1
s8 d1 t6 D; n#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
6 b2 g1 P" f1 z0 h& Q7 ^1 rtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
( g$ j- N" z% p; A! m% ltrainData <- data4[train0,] #训练数据
6 ~+ z& X8 b) |: YtestData <- data4[-train0,] #测试数据, B0 U; g6 Q9 \& Z+ J" p1 P* ~7 w
. J" V# S4 V6 @" r; c' n1 ]#2. k- d0 S) Q; t! m: S
#针对训练集,利用多元线性回归模型拟合数据。/ s# K2 r, j) i9 l
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
. o, f# q4 S2 h$ g! C0 ?! d- y4 G t" M4 v2 y2 A0 b! `) x
#3# |# d( H; Q) p _. O5 e
#对(2)中的多元线性回归模型进行诊断,处理异常值。
4 |1 i) u0 h; C2 k! G3 j6 Qsummary(lm.xy3)( Y j. E' j' O7 j6 l! ~+ d9 I$ v; h
par(mfrow=c(2,2))
1 v9 l9 ~) M# }6 k$ zplot(lm.xy3), ]+ D9 |" H1 w8 { }. n
outlierTest(lm.xy3)" j2 }* y) \8 I
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的, R' g& H' n0 H' S, ~7 u" g
% U. q4 J8 @/ p% J1 M$ S/ Z3 ^#4: k, ~( Y% |% T( }. f+ |' B A
#对(3)中的多元线性模型进行多重共线性检验并加以处理。
8 u8 X3 b) |0 N+ w. mvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在); Q4 I9 U; u& _! t
salary<-trainData[,"salary"] #引入的数据是训练集的数据, e+ K# m; r, g! s. ~" K
x2<-trainData[,"x2"]
! {% | f1 J, g. |4 S2 cx1<-trainData[,"x1"]% g$ R! Q* |9 t4 t9 ?
friends<-trainData[,"friends"]
! v5 u( J$ i9 ?lm.xy3 <-lm(salary~x2+x1+friends)8 e0 G9 w! J) X! e6 V. T5 f
j9 H& F" Y$ `. ~#5
( @" v! i) J/ b- a#针对(4)中的模型,分别利用AIC和BIC选择最优模型。1 y) H$ S3 ` s0 ~) B, ^0 ~# c5 Q
#AIC检验,赤池信息准则,选择最小的
$ w7 G$ Z/ S y" ? z. AAIClm<-step(lm.xy3,direction="both")3 _! u4 r, [' u# S
#BIC检验,贝叶斯信息准则,选择最小的6 {: M- @' n6 u1 T2 s" C
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
0 T* W4 q5 e4 W1 X- [7 {* {# q' {+ K5 `
#69 k( S* E( J+ _8 p( B6 v9 x9 ~- p
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型0 c6 {" Q, o, I( ?) M; L" I5 j$ ?
#这三个模型预测的准确性大小,并进行解释。% H" |5 O8 i# N, U0 w
Allmodel<-predict(lm.xy3,testData)
4 x: \: z' e2 G3 [* ~AICmodel<-predict(AIClm,testData): Y8 [3 }1 p' {0 ? {
BICmodel<-predict(BIClm,testData)+ ], C, V2 @+ |9 z
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
- b; k* `; L( k7 u, t1 q, C) ]4 i0 w#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根' y2 l# @; F D2 {5 ^0 q' t
#标准误差能够很好地反映出测量的精密度
0 p( _8 O" x* f( [0 \+ i2 bMSE <- function(x){
3 G4 _& R, ~' X4 \! J* T mse <- sum((testData[,"salary"]-x)^2)/50" f- A! U- p: j1 i- A
return(mse)
/ i2 W4 i S7 _}
) F$ j5 _; }- z9 }- \* m1 K6 {8 EMSE(AICmodel) #AIC/BIC/ALL是误差最小的9 T1 U5 \( h: b9 u9 F
MSE(BICmodel)% ?- H5 T* m1 j n1 Y% ]$ F
MSE(Allmodel)
% r. t. ~6 k$ e# z
: j7 K+ l: w5 m r9 O4 h1 N( O: z) A, w) W6 c# I4 l$ K( s* Q; t. A
: X3 v' Q0 e* c2 V1 ^
作者: 试试吧 时间: 2021-10-30 17:56
好,谢谢楼主的热情分享的资料! @: W, E v: O9 f
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |