- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40214 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12775
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景5 {( j9 [2 }" z
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素1 l- L% ]3 @" J9 B# b& s' M
#1
: ] k2 J) o( K4 o: x#展示数据集的结构7 i" o X8 z- D* Y: a' m' P
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
c3 o$ h0 M$ zstr(data2) #显示的结果有一列是多余的,需要删除! G; O0 a9 G! D/ P# g
data2 <- data2[,1:9]6 T$ Z; y1 n- P* i
str(data2) #删完之后的显示效果是正常的没有多余列, C0 N; J+ h. |) V
. N* I2 K5 S3 a" ~- A) X6 a#2( K8 E5 a* P1 e- O2 [& ~
#显示前10条数据记录) D; K$ A& Q. ~: k0 G' x, y0 q
data2[1:10,]
6 d9 r/ z* q8 P+ y4 L! N( {: y4 v6 [/ |$ i3 _( W( R. }9 E+ j
#3; q6 D) |! Z& l& h' o
#将变量名重新命名为英文变量名4 }) E, \( w& ?
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")) P4 i6 E& f x5 K, A; b0 @
colnames(data2) <- cnames K; T& F0 F2 i& I- Y
View(data2)
0 [9 f' t+ X0 D5 B, e7 R
& |' G: o2 Q. j8 G- I& v#4
7 `/ l$ m& i f5 H. K#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
: }7 O( ?7 w8 S: Q& D1 _5 h, Fx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
; p: c, M! E6 o0 {$ a- }0 y2 i ~3 i#View(x2) #①先算出居住时间
7 ~+ S: `) r) Gdata3 <- cbind(data2,x2)% f6 T7 Y) v5 J6 W( t+ I }* Z4 N. U5 R
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
$ `# B0 s+ [0 u I6 rlist <- which(x2<=0)/ \+ ]* J' u- V* i' X+ `1 Q1 x* Z
data3 <- data3[-list,]
4 `* _2 N7 ?' x0 q: y, e! w, Q6 @View(data3) #删除异常数据后是125条数据
( B- a1 o, x2 _2 i
2 O; ]6 R* c( x2 E: Q#5
! F* ]3 I) r: J9 A K' f5 _) A5 w1 z#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。: F. D2 S* E1 m
library(lubridate), F* q$ @. j( N9 v) F' l m- ~
date<-Sys.Date() #返回系统当前的时间; P) f; B* Q; {% _$ G1 V& `) V
nowyear<-year(date) #提取年份
( t: P$ K7 {8 i# G! q) Mnowmonth<-month(date) #提取月份
# J" y% a0 \/ c#View(date) #查看现在的日期
$ H, v" M8 j! w/ k* V; d! y#View(month(date)) #查看现在日期中的月份* `+ |0 A* p7 U" J' N) P; N+ t
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
0 |/ m1 s+ F1 Zfor(i in c(1:nrow(data3)) ){* \7 l( A I& D9 a; Y% ^: H2 N
if(nowmonth-data3[i,"birthmonth"]<0){8 Y5 y3 f9 W; ` ~, m
x1[i,1] <- nowyear-data3[i,"birthyear"]-1
7 l! B0 M* c8 k9 l& E% e" ?; A+ b }else{
0 l5 Z" e" g' f3 \% u( a% \# c) W* @ x1[i,1] <- nowyear-data3[i,"birthyear"]
" ~9 y V, A Q. S3 w }0 r/ O* i9 L# ]" R+ n8 W( e! Z# `
}+ R" y. d2 L6 `7 e; H6 p+ ?
#View(x1) #算出年龄x1,并加入到数据表中
5 L! ?- T. m& P0 D( e9 e' ~data4 <- cbind(data3,x1) % j& ]) x- P. Q/ h, w( r9 }
View(data4) #加入x1年龄变量的新表展示
) |% @9 p3 m8 g- i9 j* y- M! Ux2 <- data4$x24 E8 B; J8 f% X: c! k7 D) `2 H
Mean.x2 <- round(mean(x2),2)
7 _+ o7 I2 l0 |/ q4 h- C1 WMin.x2 <- round(min(x2),2)
, j- e- u0 m" LMax.x2 <- round(max(x2),2)4 D [: b2 z9 c
Median.x2 <- round(median(x2),2)
* f: G! H+ `; e9 BSd.x2 <- round(sd(x2),2)
9 _" e" y% F9 c% K' v9 U: gcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果+ N- c# u: J1 I% L9 k
Mean.x1 <- round(mean(x1),2)# J% h5 w( m. x, t8 G8 N
Min.x1 <- round(min(x1),2)
& B- W5 `+ p8 I! s8 F) \ }, G$ QMax.x1 <- round(max(x1),2)
! `! }9 i" T+ B7 \. }/ UMedian.x1 <- round(median(x1),2)
, _: a f- P/ Q1 [. ~+ a% dSd.x1 <- round(sd(x1),2)- p2 H' a* q0 F# h$ p, Y d* ]
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果& H6 h- O! ^0 a p$ W
x3 <- data4$friends
5 X1 p; ~3 @0 [# b! mMean.x3 <- round(mean(x3),2)
. J" w# v d7 u) Q3 a- Y9 {Min.x3 <- round(min(x3),2)+ F' {0 f( P7 y# F, y4 W* j
Max.x3 <- round(max(x3),2), X, T$ Y4 N: F
Median.x3 <- round(median(x3),2)9 S# P3 I) }9 r1 Z6 J" k
Sd.x3 <- round(sd(x3),2)
0 p7 `: X L" L- p' Ucbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果) q9 k; I |. o+ f
y <- data4$salary9 @5 J' C n) r4 W
Mean.y <- round(mean(y),2)9 |! M8 }9 i0 P
Min.y <- round(min(y),2)0 ?. ~$ E: U- X. P, x
Max.y <- round(max(y),2)
5 l1 \0 ~# G. e0 N7 DMedian.y <- round(median(y),2)
; ]0 e! o# w( s0 |& b2 \Sd.y <- round(sd(y),2)
2 t" I% I" X2 S) `+ S, Bcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果/ b+ S9 r5 E* @* ^9 b$ M/ r
4 s: h7 w# Z- B#61 d/ z n* y% C. `8 L1 M* [8 z
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
+ k/ a' O- ~' V; z/ c N2 K r: r/ ^round(cor(y,x1),2) #y和x1年龄) F: x: o6 s* \# l* y2 y8 m- B
round(cor(y,x2),2) #y和x2居住时间5 u% X2 W( n7 Z; r* ^# J
round(cor(y,x3),2) #y和x3朋友数量
8 w* c3 I& e) S
/ E* g7 W$ G7 t$ } o#7: S' Q% R9 w+ ~/ T; {, l: v! N
#分别绘制数据集中因变量与各个自变量的散点图7 W, @! T" O B+ f% D
par(mfrow=c(1,3)) #布局,一行画3个图) t& c' a2 u3 L6 {
plot(x1,y,xlab="年龄x1",ylab="工资y")6 \, g; `2 i# x* W2 m
plot(x2,y,xlab="居住时间x2",ylab="工资y")% J/ L! `5 o i$ u
plot(x3,y,xlab="朋友数量x3",ylab="工资y")! F5 E: Y& x. ~
8 D9 k( R+ |8 d#8
: S. n* R+ `* z+ W" }#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。& [7 Z( C# L- V1 ~5 r. m( n% X1 }
lm.xy <- lm(y~x1+x2+x3)
, I* }7 [ c% q4 w* f/ {# }lm.xy/ t4 B f' n3 |7 `3 D- t" o
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的) \% [. m7 S! B4 h
; z9 L1 D) G0 X#9
; F/ J# n( ]9 E#对#8中的多元线性回归模型进行诊断,确定异常值记录。* k7 U; W1 z1 x) ?# _% e
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列# Z! ?& I6 L6 O: A# P/ ~- ?8 {9 t
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
4 L0 O, e V r) O" ~0 S1 T" K5 ]#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。! I- z7 _7 C+ J' X- f7 ^' Q6 n
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。% c) S) o/ |" T' [: S7 J4 k S) ?
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
5 Q7 q6 X) U% c& N2 S; Aplot(lm)% z# O$ D. B! E
library(carData)
# e/ T4 M8 K$ f1 @library(car)
w# W, n$ G) F( g- eoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
h, ?. o3 V4 ]' t
7 Z& O7 ?4 h! o, e) Y#10
* \" p: a: I1 Z0 V$ v#删除异常值记录后重新利用多元线性回归模型拟合数据。) _! D5 ]3 g( m% R6 F" w
data4 <- data4[-136,] #删除该点
* p: X$ ?( x8 p Hx1 <- data4$x1; a& X# B; m( U) p( t* @0 c
x2 <- data4$x26 G" s8 X% L% f& e$ A& M, m+ t
x3 <- data4$friends: t' z8 { |# A& c- r, Q6 v
y <- data4$salary5 }- U5 a: O6 {# {1 i5 C
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
5 |3 f4 o" C/ M& W4 b. \lm.xy2
8 N$ g* O) I! B) h+ a# ?4 Y8 u3 K. z9 P- T" p3 D
#11
4 ~, R$ @$ S5 o8 x$ Z, q0 Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
. h, f, G8 o. d* Y* [2 Hvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
) k& O7 F( A% _* r/ S" G; |6 o! F$ J* d9 ]
#12
% t. B! J9 e) u1 s#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
* K; Z+ L) `' k4 z: e8 i8 H Bsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
- w$ d$ ^! @! U: |& V! D4 C6 T
6 p5 |' J8 y( x- {% d. R: `********************************************************************** v! c- H! J l3 x2 _ e
! Y# B) }" l( q" y. h* @6 U8 U; H0 W% s二、利用多元线性回归模型预测收入5 C0 ^( d" {; X5 Y
View(data4) #124条数据" r3 L. B; |& k) [ R0 T5 y
#12 J" R5 c& e$ r; w
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
4 a% ^/ \& Y; v+ ]train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集; R% f3 B$ b+ S. h7 w2 s
trainData <- data4[train0,] #训练数据
; R( e# {, a5 ] qtestData <- data4[-train0,] #测试数据
& U% s4 l+ J' A8 f/ {& a' M( C4 ?+ |8 X1 U0 Z
#2
; R4 ^8 i6 O+ t#针对训练集,利用多元线性回归模型拟合数据。
: t0 l( i2 l( A" P0 O" |5 m3 Nlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
( N$ m2 m2 j0 O5 Q8 n+ k& }& E" N6 \: c2 p0 |
#3
3 l6 d& Q, V: ?#对(2)中的多元线性回归模型进行诊断,处理异常值。- x8 Y+ Y$ S( X6 q
summary(lm.xy3)3 v3 ]3 Q4 u2 U, T9 ]; ?8 A4 w
par(mfrow=c(2,2))
/ y) P$ }1 L# Q( ]. P3 vplot(lm.xy3)8 T/ |" N7 L" Y: y
outlierTest(lm.xy3)& M# ?. W. M3 [6 }# e
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的 v) N4 O8 O# R
1 I; q+ K& S+ g" g( D' g" G4 w
#4
F! P. S; P& d4 ?: S# H3 T3 _8 @4 x+ d#对(3)中的多元线性模型进行多重共线性检验并加以处理。# M) m. u5 P) {" F
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
" m, r* g' u' Tsalary<-trainData[,"salary"] #引入的数据是训练集的数据$ I7 U) l6 Q0 D' e1 `
x2<-trainData[,"x2"]
. b" v3 s3 |4 M px1<-trainData[,"x1"]
' R- Z" `* @6 i ffriends<-trainData[,"friends"]
9 v, B T1 w5 J- }lm.xy3 <-lm(salary~x2+x1+friends)3 z. ]/ L1 p% s5 _* Z2 B6 }
8 N9 n& {( g# c" S5 b! G x#5, H$ Z' C5 I$ q+ K2 d& C
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。! {: a5 _& \ x$ j
#AIC检验,赤池信息准则,选择最小的
( d. L7 f1 Y7 H: c/ T; A1 ^/ N3 p/ u9 sAIClm<-step(lm.xy3,direction="both")
& @: @* t. C- Y9 z; G4 R#BIC检验,贝叶斯信息准则,选择最小的: q6 R; B& f3 l! @8 E; M
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
2 }4 K& ^) ]1 \2 S2 m$ r% y
" W J8 _) l% S9 V2 W#6
; H* u+ ?9 t% \1 S; Q+ r5 P) M#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
; l% L- p+ R# P2 x2 ^# J& r; c#这三个模型预测的准确性大小,并进行解释。9 D3 W1 d& t+ E' k6 V* E
Allmodel<-predict(lm.xy3,testData)
L; X4 h) M# ^ O% {AICmodel<-predict(AIClm,testData)
. H$ P) g/ c" g/ J5 UBICmodel<-predict(BIClm,testData)+ E8 Y% u, R A8 w) M; F; ?
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差: E9 i6 Z4 m, [2 }+ a% n4 M( x
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根) q: T1 j* H; x0 W8 `; B9 _$ u
#标准误差能够很好地反映出测量的精密度
: a) l' \$ ~+ A7 \' d% f- jMSE <- function(x){
0 y! _8 }4 F: i7 E+ j% Z/ u mse <- sum((testData[,"salary"]-x)^2)/50
$ q+ s. M: Z! g return(mse)
( h8 \! D4 @) X}
) C6 X+ f: m) X7 U8 \. ~) zMSE(AICmodel) #AIC/BIC/ALL是误差最小的
% `( q3 e0 M$ V, Q2 l* q1 _6 O4 t9 EMSE(BICmodel); n7 u9 }6 b$ H4 u
MSE(Allmodel)
1 ~$ p& H3 O% M# C7 Z: T* ]0 H4 e* w5 k! J! q% c
8 Y8 W y. a* {& ^/ M- S: J
7 g* i" H, W; m1 P" W! V2 a! P, {
|
zan
|