- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40353 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12817
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景8 a: P4 `6 ~: f; K2 X
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素% d8 M1 k" u! I: R# o9 T( q- |7 u
#1 W. ]3 I/ W2 j+ J* @3 i" M
#展示数据集的结构
+ o0 G; N; V" {; @9 G) c/ s+ D+ W; Gdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
( p3 l& W) _& \0 E2 H' N) q8 ostr(data2) #显示的结果有一列是多余的,需要删除
1 C. j* a) v- B9 c" ]- Ldata2 <- data2[,1:9]
% M# a2 d6 z gstr(data2) #删完之后的显示效果是正常的没有多余列: q2 y2 ~) ]! r, R/ b# ]. _
! n! v% D$ `% K: ]$ M; t#2& u+ Z2 m8 U7 ]% A
#显示前10条数据记录; t& G5 ?5 z u% T% C
data2[1:10,]
* J- X8 g1 I7 B6 g& k [' v
" G- L7 P9 p* y y8 k#3/ a* k; Z1 D$ o. R
#将变量名重新命名为英文变量名) ?7 K6 o) J! L$ r h
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
$ v5 {# E6 d0 C/ r2 Kcolnames(data2) <- cnames
9 u5 D2 J# k7 S- ?$ jView(data2)' P8 h z! P; E- t. ^( @
" U. m1 o) U0 O. I/ {
#42 i, x# O1 c3 l! d+ d
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录2 Z5 S+ F7 G4 a* ^6 ^- M3 N
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))$ ^1 u( }8 n1 s, q9 K
#View(x2) #①先算出居住时间
" P3 ^" l2 R+ C- x$ W! h. Odata3 <- cbind(data2,x2)
, S6 b' M5 m% \0 [0 d( y$ a" t6 `2 f#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
# D) H c9 R1 |# H2 clist <- which(x2<=0)$ d1 ]2 Y3 e' K, ]& c% {
data3 <- data3[-list,]- Y- j% o! d& N- n
View(data3) #删除异常数据后是125条数据; @% ]* X8 s1 c: ]) J
5 t+ W4 T3 {* S; q! y7 R
#5
* m4 }( ?6 k1 L+ t#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。% f: k3 h6 h% ~' e$ u
library(lubridate)8 K' t4 a/ w i& e/ k" Y/ Q f* z, S
date<-Sys.Date() #返回系统当前的时间: b* @ p v, C( n0 Q
nowyear<-year(date) #提取年份
" ], H) P a' ]nowmonth<-month(date) #提取月份; ~2 ]2 R5 F) y7 t
#View(date) #查看现在的日期
+ `1 J. L6 o( ?0 W#View(month(date)) #查看现在日期中的月份# I) T! u1 V. J, i1 d) x
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))& v; a" T. m, I' J* n( x
for(i in c(1:nrow(data3)) ){: l$ _! N) _4 ^/ E
if(nowmonth-data3[i,"birthmonth"]<0){
5 P" Q% W. b& J ~/ A7 f% w" a/ Q x1[i,1] <- nowyear-data3[i,"birthyear"]-1
+ z7 c$ W& k/ W6 b8 f6 ]& e# D$ ? }else{: [2 s! U, c: t9 Y
x1[i,1] <- nowyear-data3[i,"birthyear"] v8 N( G" e- w @
}
) ]0 d! j; g& ]! x}: u- @6 c+ ~2 m2 u
#View(x1) #算出年龄x1,并加入到数据表中
$ H# M% G+ x# e6 Rdata4 <- cbind(data3,x1)
( w: M& O2 w6 @" q/ k2 lView(data4) #加入x1年龄变量的新表展示
+ W& z0 z; ^9 j6 N, zx2 <- data4$x2- F$ B/ _+ K% e% \8 W
Mean.x2 <- round(mean(x2),2)
1 {# R0 o0 y5 j" xMin.x2 <- round(min(x2),2)
6 n# E- s! d) h- d qMax.x2 <- round(max(x2),2)4 {4 |9 ]# [! D( @
Median.x2 <- round(median(x2),2)
Y* ^5 t& q% }6 y; bSd.x2 <- round(sd(x2),2)
0 v% i) i( k7 kcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
% G/ Q/ B5 v" lMean.x1 <- round(mean(x1),2)
! u- i5 M5 i! F+ c" {! g3 m' eMin.x1 <- round(min(x1),2)
; m# e9 u/ u4 d7 ^" G1 TMax.x1 <- round(max(x1),2)
+ t( i3 Y8 {' iMedian.x1 <- round(median(x1),2)
& i+ c1 i$ B. K" NSd.x1 <- round(sd(x1),2)
3 K5 [ x* g$ j" ycbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
* v4 y$ M3 Y# ?; Mx3 <- data4$friends1 S* W; S0 D, ~- {( E8 f
Mean.x3 <- round(mean(x3),2). a+ C) f6 @2 Z/ y
Min.x3 <- round(min(x3),2)
j9 C$ u6 m' F; kMax.x3 <- round(max(x3),2)
* L& n9 h2 I/ m- d4 [Median.x3 <- round(median(x3),2)' i5 ?* [* a, a6 r9 J9 z* o8 w$ Q
Sd.x3 <- round(sd(x3),2)
3 a6 Q! D1 h) T& @. U( Fcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
5 D9 a- V+ i% w, l9 Q# q' Ly <- data4$salary( r* a# d, }- Y" I3 `( Z
Mean.y <- round(mean(y),2)
' f B4 m) N" R% jMin.y <- round(min(y),2)
% I2 R- N2 r: G6 S1 `8 KMax.y <- round(max(y),2)
W( j% ?5 s* y0 @) h4 ]Median.y <- round(median(y),2)$ l: V6 V% G- r! {& y. H# |
Sd.y <- round(sd(y),2)
* X7 n& _8 s8 p+ b, [cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果7 F* ]) v4 |' T$ g
; B2 p" @5 t- Y: H$ L#6& }" D' I& n% T* k, g
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。; E. F- y4 j, v- B- p& @6 A
round(cor(y,x1),2) #y和x1年龄
9 q1 f7 Q$ o. h( J; z( ^( nround(cor(y,x2),2) #y和x2居住时间
) n7 a- U( b$ _ Y ?2 `, Kround(cor(y,x3),2) #y和x3朋友数量- h$ H1 j8 U* T+ S
/ d2 h+ p8 W$ o5 ^#7% b* D& J5 p& N& b; V& t) j
#分别绘制数据集中因变量与各个自变量的散点图1 {# a( V' Q/ \0 X
par(mfrow=c(1,3)) #布局,一行画3个图
" v, a# C4 B7 z1 S7 H5 t! oplot(x1,y,xlab="年龄x1",ylab="工资y")
+ F% D, N% c/ T7 Aplot(x2,y,xlab="居住时间x2",ylab="工资y")0 P% a$ c; Z- ?0 j# | {. U) o
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
( W6 ^9 @! W0 `+ _+ @5 Y( f* k. F, [
#83 M. }, }0 M3 i5 [, q
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。! U- Z* ? K6 M) d7 |7 N
lm.xy <- lm(y~x1+x2+x3)- {2 V3 Q; [: I& @; L2 g
lm.xy: n$ w# n" W+ K+ }
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
! J' |2 f& l" a0 T7 J' O: Z6 H+ M5 x3 T( t6 K" ~
#9
& t; X0 h) r; j#对#8中的多元线性回归模型进行诊断,确定异常值记录。: I7 v- V1 o1 L+ p2 J6 ]& w
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列$ n9 P, C8 V: g4 _
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布- g0 q0 a' y, a& p
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。' v" h, V9 J9 N! b# r
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
% g) x8 A, f, l7 A% E: }#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。) ~; H* Z0 J6 y7 E5 i; A. o: |
plot(lm)
0 L7 |. s w/ s- Z5 {) x( k8 Tlibrary(carData)
2 `4 ~4 P$ L8 w# P- w/ ?' ?0 Dlibrary(car)) V1 T7 t2 T7 K H" V
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
2 M# P+ F& x0 O" S0 Z+ f: L3 e) q$ l; [6 {7 y# X* R' @( U, ?
#101 c- |; w/ c/ J+ y3 J! d9 m
#删除异常值记录后重新利用多元线性回归模型拟合数据。
p& h/ g4 x% X8 q* ^+ u) hdata4 <- data4[-136,] #删除该点
' `! b8 B; G- x. V1 d& `x1 <- data4$x1% K3 E7 \; U5 U
x2 <- data4$x2
& o/ I1 G' \. Q: D7 _x3 <- data4$friends5 M; }2 b1 |! Y6 }1 V7 ~6 `
y <- data4$salary3 Q7 w- q* P: R: |/ M
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
; p: |$ U* k) l/ j2 Z$ J; alm.xy21 d& S* \* X" `$ e# t
* c3 g& B9 G! U- y
#11
: J: d* P7 D4 K, J7 `#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。! }/ ^1 B9 b$ Z, }( g1 \( i! y* p
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
! S1 t! ^$ I9 m) |9 D
2 o& D8 ]3 G8 p" s; g7 I#123 S# W8 O9 P+ N) H& W
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
5 L u2 b: m8 Z7 G' V) D n) }summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星7 h: a7 K7 |* o9 s+ @, o
; n% {7 \6 I4 e U K4 t
**********************************************************************& c6 {5 r5 H0 M1 o
$ v7 D* Q9 O# o2 K0 h3 q二、利用多元线性回归模型预测收入; F- y2 S* P& F8 S M
View(data4) #124条数据* v, q M% _7 C. D( Q' r/ W! q
#1/ K- y! u( r O; R& E {7 }
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
) h! K \' |2 s1 _, ~" ktrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
4 V# ~5 ~* l$ A0 ~* O6 EtrainData <- data4[train0,] #训练数据
! }; }8 E! [8 G7 WtestData <- data4[-train0,] #测试数据% s9 K$ g+ C% I$ d0 C/ p$ \ i
+ O+ Z; ]( V0 v& V% }
#2
. `) _/ F1 X6 H* ]" O( \& o#针对训练集,利用多元线性回归模型拟合数据。/ M' f$ b8 V' l' [3 P
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])# ^ w1 e+ T; T! g
L5 m1 ^, p- Z& P; T% R#3
6 o( K' E1 r1 B6 Q! c: g#对(2)中的多元线性回归模型进行诊断,处理异常值。
9 U/ t; w+ ^8 {4 nsummary(lm.xy3)
$ h( q3 A0 {& f: v/ X, Zpar(mfrow=c(2,2))' ^/ Z+ m& x6 d& ^8 X
plot(lm.xy3)
0 R+ D6 X; ], Y4 W1 |6 u$ ZoutlierTest(lm.xy3)9 G- P. o' O. Z( K3 i& G7 w6 ^# ?
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的% h6 x1 |' I" f- S, X2 H
n3 J* }) s5 V% B
#43 r! j/ g( u' B v
#对(3)中的多元线性模型进行多重共线性检验并加以处理。- M' Z. L+ B: T+ q0 P
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
+ T3 \# ]: ]3 F. x( k8 N5 Qsalary<-trainData[,"salary"] #引入的数据是训练集的数据
8 Y: R! p: F( R: n$ _$ Fx2<-trainData[,"x2"]
3 _ k8 V& i1 B* V1 h% d2 Z' Jx1<-trainData[,"x1"]
5 W3 y& n' y* T$ `friends<-trainData[,"friends"]
% v0 V# d6 \# Z, Clm.xy3 <-lm(salary~x2+x1+friends)* j' c/ V0 ~, f- C, ?# R
6 W6 Q( i3 j6 L4 V/ h9 ]' G#5& ~" L) }5 E- a) x! n
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
& i3 `, R' e/ D5 G+ ~1 ~. ?/ i. n#AIC检验,赤池信息准则,选择最小的
! u2 u5 x1 G3 q$ T2 Y, X" W# hAIClm<-step(lm.xy3,direction="both")' r d; Q3 R* y
#BIC检验,贝叶斯信息准则,选择最小的
1 Q3 s1 ?! y( Y$ a$ y1 MBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
3 p! l! A+ ^/ P: i2 l/ X7 d! I* h [- z5 p& w0 H, d+ |* x
#66 e& T- e$ p1 a
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型2 h) s! w: x1 D% Z
#这三个模型预测的准确性大小,并进行解释。- u) [( K+ \! `5 ~4 j# a
Allmodel<-predict(lm.xy3,testData)+ H3 P& H5 ]/ q
AICmodel<-predict(AIClm,testData)
& j4 f) D# J& G/ X3 V' B6 EBICmodel<-predict(BIClm,testData)' y, R4 S$ M1 S0 L, D9 q7 N7 k
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
! `: r8 K) S& d) e5 h6 d3 a#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根) o( m) C# @! [8 s; q/ i4 r
#标准误差能够很好地反映出测量的精密度 c t/ w8 i2 w0 L" f
MSE <- function(x){
) `" O" ?6 B6 Y/ `0 } mse <- sum((testData[,"salary"]-x)^2)/50
. v4 y+ V, j$ B% z return(mse)0 i6 u0 w3 J0 ~; w
}
+ [. U; `/ A, {# ~MSE(AICmodel) #AIC/BIC/ALL是误差最小的
6 m$ [2 v! i# B ?MSE(BICmodel)
/ L/ I- v/ S1 t8 Y U% p& H1 KMSE(Allmodel)
; S4 e1 b9 E; Z# l; E# z
6 e2 L" |; X! ?( ^4 X+ \/ D) S* @0 }. h# q
' P* I R' i! Q5 ]$ |- [
|
zan
|