- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40243 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12784
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景
; x @! c! j; U) o数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
. }$ H5 W* X- {1 h' h |0 F& N#1, u n t0 t6 R0 o7 |6 p8 V
#展示数据集的结构; @. x8 G$ F. X) h! P! {* ~6 A! ]
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
& g; Y% Y! `, q: Tstr(data2) #显示的结果有一列是多余的,需要删除
* f/ c5 y1 }9 ~8 l, U' z+ o- Mdata2 <- data2[,1:9]
% _# y8 K, q Fstr(data2) #删完之后的显示效果是正常的没有多余列3 H% G$ i# z% `4 Z
6 F8 v. m7 b, Z
#2: t# B/ u/ m$ [) f/ v
#显示前10条数据记录2 B7 L7 x7 J$ V6 ^" y# c
data2[1:10,]
9 ~3 o7 J3 ?$ U
I8 M) S4 M4 c1 D3 Y* l4 p7 s" s#3
3 O# [& D5 E- X7 e' Q8 ^#将变量名重新命名为英文变量名
9 U- u3 [! J. ~/ x" hcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
9 ]- P- g. p; M& p6 Zcolnames(data2) <- cnames B$ D" Y. Z; M
View(data2)
$ l+ @1 ]6 D# ?1 `6 x& L
% T6 L1 ?0 V2 S#4
+ `) t. ?5 S0 G( G#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录0 N9 a6 P. N) n& S
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth)). d7 E; d1 P# _9 {7 w
#View(x2) #①先算出居住时间
/ m7 d: M& O/ F5 B# ^data3 <- cbind(data2,x2)
( A/ E' ?4 ^2 _+ B2 ^! s#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
) o }" _9 E' @$ ?7 slist <- which(x2<=0)
7 Z5 l7 M+ I: D% e) G( V% [; Ndata3 <- data3[-list,] w9 H" {, j: I7 p
View(data3) #删除异常数据后是125条数据
7 k5 c1 v: L j. z3 _
( k7 T. T: v) E R#5
6 U( h7 k+ I. B. s2 L' N; h#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
( P; V: V# C3 olibrary(lubridate)
& k- @( O3 a; ~% Ldate<-Sys.Date() #返回系统当前的时间
) b/ M' d% a) }% k. j3 b( Cnowyear<-year(date) #提取年份
/ }1 k6 e- M. R: W& Hnowmonth<-month(date) #提取月份! V1 y" L8 Y" K+ O% E0 w+ n; W9 k
#View(date) #查看现在的日期
5 n8 S& I$ Q: R1 O, i#View(month(date)) #查看现在日期中的月份
5 ?! o& R0 e `, M# |x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))# P8 o p) K `8 ?( ]; F
for(i in c(1:nrow(data3)) ){
0 a% v8 S& c2 Y7 J* d if(nowmonth-data3[i,"birthmonth"]<0){
. {; `# t9 t& o s' c) u3 Y' v H x1[i,1] <- nowyear-data3[i,"birthyear"]-1( O5 y" j) I& h& t& Z
}else{) X/ }8 r. v" a' W9 h7 U
x1[i,1] <- nowyear-data3[i,"birthyear"]
) f2 l1 t9 z) z' C } y! i4 v; Y$ i
}3 N/ S9 a; J) R8 N+ c
#View(x1) #算出年龄x1,并加入到数据表中
: _5 T$ M0 A& e" Q/ tdata4 <- cbind(data3,x1)
1 V0 b% ]$ A R' ~ ZView(data4) #加入x1年龄变量的新表展示+ @0 O4 j, q' p% c
x2 <- data4$x2
% J+ d# F9 Y/ EMean.x2 <- round(mean(x2),2)* _" j- I2 J8 }! r+ N& F2 n
Min.x2 <- round(min(x2),2)
; h- [) O7 w- g1 I+ nMax.x2 <- round(max(x2),2)
2 r2 T) M0 E/ ?0 T: P. b8 o" f0 kMedian.x2 <- round(median(x2),2) W6 `# ^' R7 H! E: V
Sd.x2 <- round(sd(x2),2)
% K j' m) ~5 W acbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果$ t: ~: ?& \$ G# G/ ?
Mean.x1 <- round(mean(x1),2). }/ G [& g! D8 P5 U |
Min.x1 <- round(min(x1),2)
5 O9 i9 F3 }& }* nMax.x1 <- round(max(x1),2), \( d6 V# Q! K7 N7 l1 R
Median.x1 <- round(median(x1),2)* T- I" ^3 N+ O7 H, E6 h
Sd.x1 <- round(sd(x1),2)8 K3 k' D9 c% A% ^/ v
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
3 f x& X) }: \* A+ T! Jx3 <- data4$friends
9 j2 K2 W( {. g/ T) eMean.x3 <- round(mean(x3),2)3 t6 T$ |4 s) x3 q
Min.x3 <- round(min(x3),2)
+ C+ l% f' n: mMax.x3 <- round(max(x3),2)6 s! ?( s+ S. r8 j w: J
Median.x3 <- round(median(x3),2)( {' D3 k% l# _; w1 }8 Q
Sd.x3 <- round(sd(x3),2)
2 @9 [# s$ E6 S1 O" h2 A+ Scbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果0 T8 }/ o! P! {: f' J9 n
y <- data4$salary
: e- Y% k5 X. @' R, c, nMean.y <- round(mean(y),2)
u* n% |3 S3 I. v) xMin.y <- round(min(y),2)
8 m1 _4 V* f3 l* d+ g+ j' ]Max.y <- round(max(y),2)
: o. b1 E0 P3 H$ n5 s6 b0 HMedian.y <- round(median(y),2)
3 H( R# a# o! B7 DSd.y <- round(sd(y),2)
! ^; i/ c9 X5 r$ Q& Vcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果9 E6 r6 t" w. `
# u3 m8 e3 @% \6 ~0 [8 K0 L
#67 d1 a* a+ B8 H. ?
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
8 h$ B+ s' \ e) sround(cor(y,x1),2) #y和x1年龄: [) [4 ^, H0 ]1 l s+ [6 R
round(cor(y,x2),2) #y和x2居住时间3 H, I0 [: }& s6 `% h! y) L
round(cor(y,x3),2) #y和x3朋友数量
( z5 ^) {( a8 n" K4 B- V/ R j% A& N# ^) {- I, i% W6 z
#7
) L# t5 K. f+ S: b/ s#分别绘制数据集中因变量与各个自变量的散点图2 Y, x, i1 m; E9 [ t& k) k
par(mfrow=c(1,3)) #布局,一行画3个图3 M, l8 B3 J4 }7 d1 V! E3 a9 r$ w
plot(x1,y,xlab="年龄x1",ylab="工资y")
$ {. e% d9 E* R! hplot(x2,y,xlab="居住时间x2",ylab="工资y"), f3 ~& d8 {) y; \' v* ^% _
plot(x3,y,xlab="朋友数量x3",ylab="工资y"), J" @' V% u0 I1 n6 _
2 P6 `% H, B# t#8
8 y9 _( F3 ]% o! Q1 e#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
3 _( [ w6 u' d8 B. wlm.xy <- lm(y~x1+x2+x3)
4 L( s1 {5 q# Rlm.xy
, L1 u' J3 X4 v6 I. Y: b" }# Ssummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
7 [2 m' z6 l5 u. w
" T1 H' {4 h: j2 Z1 b' h; v, M' R T#9& a" ?' ^$ m( T" M6 @* l2 `
#对#8中的多元线性回归模型进行诊断,确定异常值记录。 U e z; U8 w0 L8 C6 \. i- F. x
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列8 f3 c. d+ [$ @( N8 G8 _
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
" j5 a. [) P( v e: w4 B0 G#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。* m/ u1 V L/ p9 Z( n, V
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
4 X3 X" l" C' Z6 C5 L#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。" M( r( R* j) W6 R7 L7 g/ t l J# N
plot(lm)% r9 L8 R# W8 b
library(carData)
6 Y" O3 S1 \; s/ q6 U8 Nlibrary(car)1 y) G+ P: z& r: w2 g/ k
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点8 y: ~0 H: R5 S: h+ M" n& e7 a$ b
* N4 _, q+ B* m5 T6 O. d: J#100 D2 {9 {6 N1 {* N2 P
#删除异常值记录后重新利用多元线性回归模型拟合数据。# e( V+ |) S) O" \! V* z
data4 <- data4[-136,] #删除该点1 c3 ?* u; Y$ B7 f
x1 <- data4$x1
; t3 @: h; U( dx2 <- data4$x2
% I* O: {; [5 h9 zx3 <- data4$friends G1 o' `* C3 f# D' N
y <- data4$salary
" n8 A! t+ ]4 q8 Mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
: V1 H3 x0 G) L% \+ ]/ r; {lm.xy2
' T9 @; Y0 D; [8 M" w: L
], J' {7 w0 X* i: b" j1 \% L' J3 |#11
- {0 t. A" \/ {. i0 T' t+ t#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。3 z( }* T# O9 x' u/ M
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
0 x0 f# H* W* P* Q9 W K9 t
. ~( a) }& l6 y! e& O* a0 s! F#12. R5 G' [" U0 L7 |# T( a
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
0 w4 f8 ]1 {6 ^- q- w. Ksummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
: U) H% f2 K( f" c' u* ?' \. f; k* j, E9 L9 H; u
**********************************************************************# f t8 [# V/ ~' n
* a, v/ w" n% Y) T. N8 T二、利用多元线性回归模型预测收入! G0 O. q: P6 A6 C5 s [- B
View(data4) #124条数据- b. W* H5 l. p5 G
#1
+ h- g1 M) N6 ~# B$ W$ m#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
; d. ?* M% f; {1 w# }& ptrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
4 X7 z l! X6 X( StrainData <- data4[train0,] #训练数据
m H3 }3 W) F5 l0 M, d$ wtestData <- data4[-train0,] #测试数据
3 g+ a C$ x1 a3 a9 I K. E: c6 f/ U9 D4 `1 i, ?
#28 Y8 |: _% k+ _) H& F
#针对训练集,利用多元线性回归模型拟合数据。; g' g% H8 I2 a% }2 I: M" }
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
5 o2 H. T" A3 s, Q" A5 K3 M8 P. T' Y( u) {
#3% m4 H* h7 x1 H
#对(2)中的多元线性回归模型进行诊断,处理异常值。+ Z5 M9 x) L$ ]$ H4 g H
summary(lm.xy3)6 J/ l- c$ N1 j7 ?' W; d
par(mfrow=c(2,2))
$ S/ u) O* r: e3 Z' J3 K! v- L8 Tplot(lm.xy3)
9 G p. {2 }. B5 Y# ?6 OoutlierTest(lm.xy3)1 T! o4 X% g7 N) q7 [8 c6 N
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
9 U Q7 G) k3 q
4 \! P6 T* F7 m- z, E3 e! ^/ b; ?#4
+ j5 J5 L0 r$ ?4 {; }7 V! U% \#对(3)中的多元线性模型进行多重共线性检验并加以处理。
1 z0 O) J$ [5 ^vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
: g1 W5 a9 E/ I+ @$ o# e. fsalary<-trainData[,"salary"] #引入的数据是训练集的数据
! D: f# H# @; J0 J1 y' y0 Jx2<-trainData[,"x2"]
/ y2 b5 ?) F7 z7 ~7 {! Wx1<-trainData[,"x1"]
! o# N& h$ c5 |, g# x/ N6 w' sfriends<-trainData[,"friends"]
% G/ h$ Z( N! h5 jlm.xy3 <-lm(salary~x2+x1+friends)
5 a" k4 j) \+ K5 w5 v3 {0 v
% \4 l% J" i3 y% k. W; u#5
; C! A" q) J. f#针对(4)中的模型,分别利用AIC和BIC选择最优模型。* o$ _4 c8 f3 g5 `
#AIC检验,赤池信息准则,选择最小的
6 z' a" O4 f* Q) v6 @& ?4 G. CAIClm<-step(lm.xy3,direction="both")
) ]9 b: U. r0 O7 J: g) z#BIC检验,贝叶斯信息准则,选择最小的5 z$ U8 \" }9 g- X" ?2 y5 z
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
) o' p6 B/ {5 J: X) ?7 Q
/ S$ ?3 A2 V7 d# `( k: k#6$ O) E) H7 z3 @2 Q( g
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型1 W% T, G1 u- H
#这三个模型预测的准确性大小,并进行解释。
9 x; b0 ^( m- n6 H. s6 cAllmodel<-predict(lm.xy3,testData)
2 B: ^5 s5 o+ u. V7 Y* I- XAICmodel<-predict(AIClm,testData)
2 z6 D6 J5 @7 ]5 vBICmodel<-predict(BIClm,testData)
5 y. ^7 [* T* b; }; u#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
" b# q; T4 z, _2 B% o#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, C1 g7 ^7 v4 F& |
#标准误差能够很好地反映出测量的精密度7 L' S" y% d' A; b+ g
MSE <- function(x){8 |- w" Q* [3 Q$ h( \
mse <- sum((testData[,"salary"]-x)^2)/50! S+ `2 |0 o; _" x
return(mse)$ p a2 z3 Z" J. ^7 U& `8 r: J
}
) D- Y$ O& w1 N- C UMSE(AICmodel) #AIC/BIC/ALL是误差最小的. C( ^, B& A( u" ]! Y& B
MSE(BICmodel)
$ W1 |. p% K6 ~" hMSE(Allmodel)
G9 \8 ]/ c$ Q. M& Z+ X8 \/ B$ h- f7 L) W) H' ~
4 S' N5 B/ e+ |. H- |0 m% m F% s
( L3 p5 z' y% \. L2 t' t |
zan
|