- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40325 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12809
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景 h' Y" n6 r& e
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
/ X7 \+ Z. l6 r, ?# i' C/ }#1' f# T) H6 V. O. y& s5 z
#展示数据集的结构% ^0 ^: x; G0 _/ C5 I1 _
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
. ]( M( f) o6 Wstr(data2) #显示的结果有一列是多余的,需要删除, B0 F- {2 X7 [, F/ `1 W* {
data2 <- data2[,1:9]
6 }* q% e6 a0 `str(data2) #删完之后的显示效果是正常的没有多余列& j$ {/ S u$ W/ `2 [
, n) h$ t* ?( a+ c8 T6 h#2
4 g* R2 E- r# ^$ q, Z0 K$ ]; z#显示前10条数据记录
. c0 ]4 L6 j. {1 n! f! s4 l8 i2 ~9 odata2[1:10,]
9 q4 \0 D+ U0 P6 W7 m9 f
% y" M5 ~3 {$ e/ k#3- E" z' E q" o- A
#将变量名重新命名为英文变量名
+ v8 I- \1 y0 Z+ s/ V' n7 hcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
$ g( m6 C) r5 u) zcolnames(data2) <- cnames
! |& ~/ o# j0 L" n: i; r& }View(data2)! J$ s4 [( H, O3 M g4 E1 A
6 ^3 x+ `: B8 G& F3 F t" ?
#4
8 x" C2 n9 r/ D, |- @7 d. g- A. D#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录6 F+ a* Z, c9 `2 e0 M; Y6 X
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
8 @ n- r1 N- o) _4 L! g$ W& T#View(x2) #①先算出居住时间
4 l/ l3 x, C+ x- p% h! Zdata3 <- cbind(data2,x2)
: m) F$ G" c% }6 S5 \; d& i( Q#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
6 q( ~2 T% L0 _$ W$ \1 ^list <- which(x2<=0)) a( \0 V2 T' g
data3 <- data3[-list,]
, h/ |; X4 L1 GView(data3) #删除异常数据后是125条数据8 O1 D" J* ~1 u4 g
, j/ `8 f+ m; K! J% W5 j
#5
$ t6 w! X4 U6 w( u#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
- i9 n- Y$ C- S- hlibrary(lubridate)
0 P) z- |5 U _- |date<-Sys.Date() #返回系统当前的时间8 {" e6 P$ u g. L ^- q
nowyear<-year(date) #提取年份( G! z. ?: L0 \# z' `8 y+ _* o" O! n
nowmonth<-month(date) #提取月份
& H0 S$ t9 ]+ e: {6 ]% T& i( L! b# P#View(date) #查看现在的日期
, V; r% d; Z" M$ L; g#View(month(date)) #查看现在日期中的月份& Z k. P& T3 W3 h* o7 ~3 |4 P* `1 j
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
4 J" k4 A7 @4 }# N) Z7 @% ufor(i in c(1:nrow(data3)) ){3 \& [( O) I( X& @" p7 `/ a! i) q. L" K
if(nowmonth-data3[i,"birthmonth"]<0){" k2 O9 I! i: E5 D& y* Z4 m; G
x1[i,1] <- nowyear-data3[i,"birthyear"]-15 | T; k9 u# A4 O9 \. A( I
}else{0 O; l2 {3 `" O C
x1[i,1] <- nowyear-data3[i,"birthyear"]$ `& B6 B0 X# J/ D+ `# [# e
}
9 r8 x: b5 f6 i2 m, Q6 d9 s}
/ P5 q) k, |4 i% i#View(x1) #算出年龄x1,并加入到数据表中: ]" \9 `4 Y8 n) w6 D
data4 <- cbind(data3,x1) ! W9 @( S5 f8 x7 A
View(data4) #加入x1年龄变量的新表展示
0 j3 ~' x5 b" B& v1 K1 @x2 <- data4$x2) x6 x" m" O) H) ]; m* l
Mean.x2 <- round(mean(x2),2)
( v+ n( F# [6 BMin.x2 <- round(min(x2),2), K$ g6 E! B! I0 C8 w' W( r: R. U
Max.x2 <- round(max(x2),2)5 a& @; T! F& g! g
Median.x2 <- round(median(x2),2)9 T. [, k- d1 a5 }7 ^2 W9 y
Sd.x2 <- round(sd(x2),2)0 \9 f1 n& }7 J) [- t$ ]
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果9 |6 E3 k2 Q1 e, L: a
Mean.x1 <- round(mean(x1),2)- e: U# L, {" x; h! F. E
Min.x1 <- round(min(x1),2)
& _3 N0 w' k3 ]# V, ?Max.x1 <- round(max(x1),2)
( k' a/ z7 ^) Q& G( n$ LMedian.x1 <- round(median(x1),2)
3 d' V6 C+ d }7 [2 p; dSd.x1 <- round(sd(x1),2)
" d0 K6 t4 O3 ]: P" Fcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
# ?( v' Q% r4 nx3 <- data4$friends
" v8 F0 ]; L8 @& m. w8 B& IMean.x3 <- round(mean(x3),2)
+ g1 N) `" d1 _* F6 N( ~Min.x3 <- round(min(x3),2)* @5 O% w2 v7 `7 p
Max.x3 <- round(max(x3),2)
( p% y" z+ U: pMedian.x3 <- round(median(x3),2)& o/ h: s8 O2 r& ^
Sd.x3 <- round(sd(x3),2)
7 ]4 E0 y+ d# D' R' l7 _4 U# J/ Ycbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果1 f0 M) R1 W7 q! v7 J6 x
y <- data4$salary
3 c. h2 d% j, F9 x, `" |2 yMean.y <- round(mean(y),2)
" c' d( H {8 | U: N9 r& @5 uMin.y <- round(min(y),2)5 m, _- m8 A2 ^3 [7 O! \
Max.y <- round(max(y),2)
8 J% R$ s, K) v6 e3 L9 V/ _Median.y <- round(median(y),2)& v U# i# k; k9 u; A
Sd.y <- round(sd(y),2)( l2 V; J9 g) o8 @% D/ j
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
/ R6 \7 C3 N( J
: |, P; o6 v- G4 _' S#64 |% s( @7 L' q0 D$ u
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。4 I0 O5 K/ L( g3 t
round(cor(y,x1),2) #y和x1年龄0 ~7 P) p, R/ x/ b7 X
round(cor(y,x2),2) #y和x2居住时间" t6 \+ r5 K! H0 n4 d2 H
round(cor(y,x3),2) #y和x3朋友数量7 [& I* D! h4 [2 U, E
: J4 b( l$ b( ~- w1 A#7+ h: k8 s9 W$ Z, }
#分别绘制数据集中因变量与各个自变量的散点图/ p- I. S0 h. |1 } R) W3 j
par(mfrow=c(1,3)) #布局,一行画3个图' m2 l$ Y+ N% ^) q1 O
plot(x1,y,xlab="年龄x1",ylab="工资y")
3 g7 j( j* v }2 g! z Xplot(x2,y,xlab="居住时间x2",ylab="工资y")% T6 H0 z. K# {0 v$ U1 n$ `$ r/ _( M
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
0 [: A5 a* O5 g6 ^' E9 A! s- g. l, y) _) h. |
#83 D+ C1 G. Z, P6 J
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
' F8 E2 }/ P5 ?+ c- _2 W' hlm.xy <- lm(y~x1+x2+x3)
. ~9 g7 {8 L: }, c$ \8 i2 |; _9 Ylm.xy
3 {4 z3 k6 K; P6 {+ A' f% g; _summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的: \- ?4 @5 D: G$ N, e! a
% O C) _1 L( l; @6 B% F' U
#9* h0 N* D( i! S- E5 A
#对#8中的多元线性回归模型进行诊断,确定异常值记录。& q& n: F3 e, P
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
/ `" R# J4 J4 w#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布* t# ^+ S3 |% K& P: |/ B/ n3 L
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。9 u; v8 N) D$ M
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
6 I; I* j) L- @- M3 m: `! v#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。/ O4 {# L* {& f
plot(lm)
# H5 Y a5 B. H5 ]+ M* o/ Z* _; Elibrary(carData)
& Y4 k* A) @2 W7 n1 b. R" H4 nlibrary(car)
# f9 x, o3 q& V) A# n, ^outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点+ w9 F' X2 U& v: n; R
, s S8 b2 K J$ k7 V2 ]- o#10
8 |- p/ |3 ^. e: o$ q+ \! ~#删除异常值记录后重新利用多元线性回归模型拟合数据。; y5 u( w' E @2 D. y
data4 <- data4[-136,] #删除该点4 Q, F) v( C9 T& L7 l
x1 <- data4$x1% @. K6 ]1 y5 G, M, {0 Y
x2 <- data4$x20 \! [8 j" Z$ q& e( t- {
x3 <- data4$friends, z' S: k+ { q& g9 r" ?
y <- data4$salary
# ~/ M2 E7 c1 q9 P2 F. l N( dlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
/ G% z' f" P. a/ k" [4 r4 |lm.xy2! r7 F1 z: I* }+ \/ g0 B" V
1 T9 G+ _' \4 S S7 g
#11& K* o; }+ M( `: K4 ?7 V1 }6 d) Q) ?
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。- M( p3 Q% L/ a3 b7 p& j7 m
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)0 L( g3 k/ N. ?6 L
1 d; e2 Z9 I3 b6 C+ m) X7 p
#12
" }, y* d. J/ c( j" {* f3 [! w#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
: p; V* N! i6 [" Y) ^, [summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星7 w. M, W ]/ A ~) X
1 ]9 M5 r4 o" [% }**********************************************************************; w( U w% @# f3 ?. L; E% p% S# @
5 U: P9 j$ G" D7 J1 R- k
二、利用多元线性回归模型预测收入
+ `, t* b' M" ?' _5 RView(data4) #124条数据; O% r2 d% s5 a- k, R# w% C
#16 l) a/ U2 U# u; k9 H# R
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。; G4 R9 `3 n2 ?; s
train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集& [- R2 H* s5 y U" v
trainData <- data4[train0,] #训练数据
2 j7 J) b* I6 ?9 `$ ZtestData <- data4[-train0,] #测试数据; I+ w6 j3 l! O1 q8 ?% q/ t
& |9 ]7 n: D7 v#2
4 ^ e) p1 o7 V% H. H#针对训练集,利用多元线性回归模型拟合数据。 \# t5 b2 `9 v H; J
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
* Z* }, o" I9 _" W G& ^' s8 z) K1 T# C- ^+ t& `+ a% t
#37 m# ?5 n: |$ A# |9 I" Y3 V9 L( G
#对(2)中的多元线性回归模型进行诊断,处理异常值。
0 Q, V) y5 A/ J1 r6 x J5 D. psummary(lm.xy3)
) A1 d9 o' Y8 m$ Gpar(mfrow=c(2,2))
$ P; T' @9 V# v, d4 x; [plot(lm.xy3)
# d+ k0 o, d9 E$ i: z% N/ [outlierTest(lm.xy3)
( g" t+ f" `) U4 d) _, ^! f) BtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的2 r7 C, @. l# _9 W
6 a! s9 t( E5 N" r. S/ A/ D#4
; q- A. I' ~0 C; O0 C s5 V#对(3)中的多元线性模型进行多重共线性检验并加以处理。, f" r) D& D5 M
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
9 x2 V& @7 Y4 q+ Osalary<-trainData[,"salary"] #引入的数据是训练集的数据/ V5 ?- }0 i$ R. J2 [
x2<-trainData[,"x2"]7 R$ Z3 R, ~* j$ e
x1<-trainData[,"x1"]3 a, O$ E M' z$ Q) Y( y Z
friends<-trainData[,"friends"]
. \0 m+ x+ A1 qlm.xy3 <-lm(salary~x2+x1+friends), q+ f' U. }9 T* ]" `
: F/ n* C2 v! A' d Z. D |
#5
' o$ P9 y' s7 k/ O2 ]0 X#针对(4)中的模型,分别利用AIC和BIC选择最优模型。$ `- O. z: R# z) q5 E) K
#AIC检验,赤池信息准则,选择最小的& g# @- h" U) A! m- a
AIClm<-step(lm.xy3,direction="both")
/ m, U) b6 w7 {) N* c$ r, O#BIC检验,贝叶斯信息准则,选择最小的
7 @. l5 a9 Z9 A" `" F0 JBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")/ B9 x# r2 h4 y
0 _. h, y0 Q8 {% x. V: F( T8 n; Y
#6
' N# M' P E0 O/ Z- H% y* N; s#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
) K$ V# o7 u& f# r5 J" c2 I, d2 g* {#这三个模型预测的准确性大小,并进行解释。! ?2 X4 l2 d4 X- o6 q% I( _4 b4 Q Q
Allmodel<-predict(lm.xy3,testData)
% M( C2 K _' Y7 ]( j$ ]5 tAICmodel<-predict(AIClm,testData)& P- t* n8 M* D8 ?5 \. @
BICmodel<-predict(BIClm,testData)
" U) }2 c- c1 \#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
6 O2 |6 i r9 j$ X9 ?8 r8 X- z- {#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
; O3 K+ ?/ Y0 ~. L0 R" P1 M#标准误差能够很好地反映出测量的精密度
% G) S& l+ g4 ?+ P+ f9 M# r( DMSE <- function(x){
+ L% u6 s3 o( V4 Z: R; ~ mse <- sum((testData[,"salary"]-x)^2)/50! g f4 e; Q# L) ]/ o
return(mse)
[) @( n5 P1 p+ ~( j}
( k$ s, b) X. P- T, r' kMSE(AICmodel) #AIC/BIC/ALL是误差最小的! z. r; h2 G/ ^
MSE(BICmodel)& I0 q" P5 I% d% z q
MSE(Allmodel)
& t# {0 z' G4 g7 d. y; m+ ?' S' ^/ U' f* |, Q k r& i0 ^% w+ s
3 R2 J/ X0 X6 A9 `9 {
; C2 q0 l4 j$ J1 u4 e |
zan
|