- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40356 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12818
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景( ^% i6 l1 V- z- c& b! \
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素* N/ a9 [1 p! i% [" f3 p
#1
4 p. \; E6 P1 W; V- C9 }, L#展示数据集的结构( W4 F5 e8 ~6 L, E: Q4 N6 j1 J7 w* }
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")3 |4 d& ?) w) G; U1 w
str(data2) #显示的结果有一列是多余的,需要删除0 e3 G d' R: g7 O( A& }
data2 <- data2[,1:9]
" s5 X: x5 v4 x! P# \8 ]4 Jstr(data2) #删完之后的显示效果是正常的没有多余列
9 h% J6 b" l E! u4 o3 o- t
5 D0 T8 X* Y& F#22 i, r9 @; ^- J q6 ^
#显示前10条数据记录
1 c/ C9 A2 c+ `0 X: g6 x, ~/ T _data2[1:10,]
, D: V& j. W0 S4 ~, {
9 {* |; @" ]3 P#3
8 L/ h c; b& W t#将变量名重新命名为英文变量名* c' m6 [. B* ]% s b, o
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")7 \! [$ Y4 t$ j' q1 d
colnames(data2) <- cnames
7 w7 D4 x9 T! BView(data2)- g4 Q3 P! M' M
3 O: ~& u) {2 Z. s* a, h0 d0 v
#4
8 S& p7 @+ u( x6 a8 O9 \! q8 T#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录 |! H* l# w7 z- W2 G
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
. q) ~& j' q7 K( a5 x+ ~#View(x2) #①先算出居住时间
/ W+ ?% E: q. l0 _1 e( v/ {data3 <- cbind(data2,x2)3 U: W9 R4 w, R" M) d6 O* N
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条. @/ x5 E; c0 p1 e8 }$ M
list <- which(x2<=0)5 o6 h" J( c) d. U
data3 <- data3[-list,]
9 x( L* b T2 ^$ e4 w2 vView(data3) #删除异常数据后是125条数据: Y$ p5 A' u5 [$ n& j. g0 s2 a
/ A2 p0 J: Y7 o#5
1 \7 R0 q0 u$ h! {# U2 f: H! q#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
' d! N6 U* \) B, o1 H- ?5 h8 Dlibrary(lubridate)# R3 v s3 C, v) Q8 _* ~
date<-Sys.Date() #返回系统当前的时间* p8 d$ O/ A: \' Z: E
nowyear<-year(date) #提取年份, Y8 _' ]/ F8 B9 k! s
nowmonth<-month(date) #提取月份% p; Z6 S+ K9 ~" k* x1 E$ g( k1 t
#View(date) #查看现在的日期* g* Z- e5 d }" p
#View(month(date)) #查看现在日期中的月份4 ^# s1 Z, o; ]! i2 z/ H! _
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))4 L$ [/ L4 h) J3 `2 m2 M$ q1 y
for(i in c(1:nrow(data3)) ){& A4 Z c4 F, @3 R
if(nowmonth-data3[i,"birthmonth"]<0){
; C# i+ d" P9 I x1[i,1] <- nowyear-data3[i,"birthyear"]-1
5 z1 j. N& h! n/ M }else{
! s' ^& t' Y" p0 J x1[i,1] <- nowyear-data3[i,"birthyear"]
* i( h: u8 B- R t$ Z4 x$ U6 U6 j }. L- N# K, N$ L
}8 I" ]- S& L* W
#View(x1) #算出年龄x1,并加入到数据表中
, ?7 p; V1 C1 l% F7 X, @data4 <- cbind(data3,x1)
3 `4 L; ^. C0 w. vView(data4) #加入x1年龄变量的新表展示$ T( w) q. Y! G& f
x2 <- data4$x2
( G9 P1 i! s' P5 R, {Mean.x2 <- round(mean(x2),2): a; d* L2 g: L6 ~0 P. B
Min.x2 <- round(min(x2),2)
. h4 y2 w J8 v9 ^Max.x2 <- round(max(x2),2)
6 Z# t7 W1 t/ vMedian.x2 <- round(median(x2),2)' S$ C; B- V' T' I9 f
Sd.x2 <- round(sd(x2),2)
, R' W7 m# Q+ f9 S6 i# J% Ccbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果6 d. h: w4 g/ o
Mean.x1 <- round(mean(x1),2)! D/ e2 q1 _' _+ \( U
Min.x1 <- round(min(x1),2)+ }, O9 E: _) n0 S* o8 h9 ]( n1 R
Max.x1 <- round(max(x1),2), A1 X3 D6 k- S1 V
Median.x1 <- round(median(x1),2)
- K" T, c4 W, ^4 ]: }! o" gSd.x1 <- round(sd(x1),2)6 K$ ? ]7 ^( u6 [# F5 m
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
) [' M% A+ y5 Q9 {7 M% Vx3 <- data4$friends5 _) C" t2 T2 N% ]# t0 a- R
Mean.x3 <- round(mean(x3),2)
2 s: C# p; C- ^1 g% W7 sMin.x3 <- round(min(x3),2)
: `1 m2 ?& U' t6 G1 aMax.x3 <- round(max(x3),2)
! M4 i7 ^6 k4 @8 A, A4 D. R& g l" }4 J' JMedian.x3 <- round(median(x3),2)
7 ~6 g+ l& J" r0 T1 c) F# M JSd.x3 <- round(sd(x3),2)- s4 i! m# N; I/ [. f, m
cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
1 ~" I8 y( K, qy <- data4$salary4 K {: a+ J' U# c: P# r* w! z
Mean.y <- round(mean(y),2)# F3 j; j D5 j% Q- l# Z, r8 \
Min.y <- round(min(y),2)
+ ]; s S \. e4 @7 H. pMax.y <- round(max(y),2)5 A4 v+ G5 P0 Q5 q( F: _. {
Median.y <- round(median(y),2)8 U5 r( L& K3 z1 d* L
Sd.y <- round(sd(y),2)
: |& C% ~; n8 ucbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
1 y0 F' m2 E5 n r) Z6 |7 H
4 J5 o3 d/ \1 M) b h#6
8 E1 E+ ?" q X# c#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
( K W1 n& M, i( Ground(cor(y,x1),2) #y和x1年龄
3 |, P4 o& L% d( Around(cor(y,x2),2) #y和x2居住时间7 {+ n# b1 M$ B, w' D' |! B
round(cor(y,x3),2) #y和x3朋友数量
0 Y U. O9 {$ d5 m$ Q
$ q8 H8 I( w3 {9 @, W! q+ O8 S' }$ E#7$ G! p, V' z" o5 e( j8 X( O2 H
#分别绘制数据集中因变量与各个自变量的散点图
2 d( g; U9 x9 f& gpar(mfrow=c(1,3)) #布局,一行画3个图
. |. I ^. m$ ?. g [7 Gplot(x1,y,xlab="年龄x1",ylab="工资y"): y: |8 X/ C8 E# z1 p
plot(x2,y,xlab="居住时间x2",ylab="工资y")
- T H4 d) q7 q( I' p+ Pplot(x3,y,xlab="朋友数量x3",ylab="工资y")+ b' _' h" h0 |' ^- I9 w
' I6 R1 i3 p0 K' r' j
#8
6 B0 D, |4 g* U; Z( S; P#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。+ x2 Z: E5 x7 u! F/ k' |8 b
lm.xy <- lm(y~x1+x2+x3)4 Z+ o- ]* H. c0 M+ S8 P# b7 Z3 @7 s
lm.xy
. ]1 z* `2 ?' csummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
3 e% h6 A: N3 t, x" w
4 x" O" u1 F2 U+ M/ ~#9
. L- o( G B/ n* _5 t6 t#对#8中的多元线性回归模型进行诊断,确定异常值记录。
% n9 a( S7 H$ G8 R# Jpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列) Z- R1 W t( j' B6 j t! R( z" A
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布7 F7 U! O2 I1 @5 Y- o
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
" _/ |' O' R2 c% D#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
6 X1 p) F( Y0 j#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
. ?/ c9 ~) [+ f' dplot(lm)
( M" Y& t+ U4 a& E! Blibrary(carData)
) ?! z9 u1 y8 @1 w$ Y1 `# }library(car)7 V3 w: O4 |% _) D" d
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
. g+ q- U- W. Z7 n1 g% C$ z8 A. ]+ Q# K$ `4 S- _$ _
#10
3 e6 J" {1 i) r" v" l) h6 D- [ q#删除异常值记录后重新利用多元线性回归模型拟合数据。0 M0 \8 n4 w- T
data4 <- data4[-136,] #删除该点
$ d2 e; [" n" F) N1 y5 V, w: Ox1 <- data4$x1
/ n5 Q) Y; J' vx2 <- data4$x2
3 a3 n' Z( ]% F8 N I+ d6 ^0 ?x3 <- data4$friends
- V" H4 C5 y1 g. z9 }y <- data4$salary
5 b6 J5 a: m- |+ A2 glm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型" ^* {2 }7 H, J: p( O! E8 ?
lm.xy2
9 M. [$ b; V9 q% i9 {) r; [9 ]& r
6 P/ w3 U3 Z* o% k9 M#11
! y5 [$ M, K, Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
/ o3 ` N# e/ Uvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在) O1 w! r7 [4 F/ R; {' Y
0 K4 [9 R/ k( s% p1 Z, h#124 z3 L5 r/ S- L4 }
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
) R, Z8 B2 }: Usummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星& D+ @% \. i& ]" h* K5 E
; c+ C/ t b$ y p5 B* ~4 O& d**********************************************************************4 W& M5 T g4 r( l+ }* d
$ J! G* o T% H2 W1 ]( O! g
二、利用多元线性回归模型预测收入2 G6 u5 b0 i' q. Y( Z N
View(data4) #124条数据
" r7 W0 V( b0 p" `9 A#1
. M2 K. E9 o" ]#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
2 v8 ?+ ?1 p7 m5 X( J# Vtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
2 V- i3 J' j1 S U5 P9 j' o" {trainData <- data4[train0,] #训练数据( ~- c5 H" V. @! p- w; @! _7 ^. I) J
testData <- data4[-train0,] #测试数据
1 @; L% M- [! N4 L$ ^. Y1 q4 q# P1 s) ~' Q
#2
6 x) e/ [0 f# S3 p9 i: x3 w. m#针对训练集,利用多元线性回归模型拟合数据。2 L6 N# B0 M' X7 l
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"]); K8 b3 r. d9 ~+ n6 j* B& [/ B
3 j' y1 E9 f4 ]7 j A1 _#3
4 ^( `% _) L2 L3 X% M#对(2)中的多元线性回归模型进行诊断,处理异常值。* B" _6 H' ^" A
summary(lm.xy3)+ n! f0 f n7 B
par(mfrow=c(2,2)); I6 B$ ]/ X u! B+ x7 `8 F* L) i
plot(lm.xy3)9 a( \4 b& O0 a, z7 V% b, ^! [% P
outlierTest(lm.xy3)& l$ B; Y6 g& N0 H8 w, o1 J$ s
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的' P0 w5 w3 n5 ^& J6 B6 Q
& h) ?6 N7 n, u4 S: s#4
0 [4 L1 l/ o) F2 Y#对(3)中的多元线性模型进行多重共线性检验并加以处理。4 a2 ]7 g, i {: ?- |" {
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
5 }! z2 V" ` [9 ~, T& R/ Hsalary<-trainData[,"salary"] #引入的数据是训练集的数据 v. G& W1 Y0 ]) t; _
x2<-trainData[,"x2"]
5 i3 o' {- Z. O+ @$ K6 u% H9 h& Xx1<-trainData[,"x1"]8 o- x' h. W& v3 |
friends<-trainData[,"friends"] F4 y: f/ g: N
lm.xy3 <-lm(salary~x2+x1+friends)/ N# ^' ]$ [* T# J
7 ?5 _8 w$ Z" l/ C9 Q0 W I' ~#5# n2 q5 _ M* k, Q ]7 n
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。3 D: L7 K/ R$ q: p! l% ?
#AIC检验,赤池信息准则,选择最小的
* w/ T6 ^8 K: oAIClm<-step(lm.xy3,direction="both")
2 M, Z8 ^ y5 r#BIC检验,贝叶斯信息准则,选择最小的
, \$ q) p4 ?2 C8 Z- sBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")& B# n( }5 A3 } w
( f! n+ I r5 A% x8 j5 M$ N
#63 K/ @- T/ A' Q: z! \0 M: Q# R
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型' A! e! t+ T! v% G; V) T
#这三个模型预测的准确性大小,并进行解释。
) @& O( B+ z# kAllmodel<-predict(lm.xy3,testData): }$ E+ C+ a2 q( b: m; k0 r
AICmodel<-predict(AIClm,testData)1 T& R! Z3 n/ I* a
BICmodel<-predict(BIClm,testData)
# H6 w/ L/ _6 b) r1 k) k/ Q#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
) F+ E. C5 v5 ~5 Z# G4 b. e#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
# U, N! v# @1 x9 u! z0 W#标准误差能够很好地反映出测量的精密度# K! b6 g2 N/ o* k" v4 e/ k8 t8 }% L
MSE <- function(x){' W' y, e" W/ Z6 N+ R. _& E
mse <- sum((testData[,"salary"]-x)^2)/503 Q( a* f3 l0 Y/ R6 i2 Q9 Q J" P
return(mse). F" o2 W0 I; t& W( ~- @# x
}
, X: ?2 ]1 q& F4 O7 UMSE(AICmodel) #AIC/BIC/ALL是误差最小的
9 ?; r. ] i" i( R2 HMSE(BICmodel)4 q) X4 l# X" i) W
MSE(Allmodel)! D6 L0 @/ Q% |; I! J1 b* f. V
1 ~8 } s& `& V+ P( f1 V& t& F3 u$ s8 K5 {- [) b
# t% M" O: N2 k9 j9 W G$ h/ G& H
|
zan
|