- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40029 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12720
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
【高级数理统计R语言学习】2 多元线性回归 一、背景
- j2 o+ b# c6 \0 o# _/ o, T, k数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素+ Q* G/ q7 d. i* c# _3 M
#1# L& Y0 w- L% Q) [, n5 D8 K
#展示数据集的结构4 [( o8 E( x* e
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=","), h1 C' E+ G1 W! T5 V1 U; E6 P$ H. ?
str(data2) #显示的结果有一列是多余的,需要删除 V# ?0 N* O3 I3 }) ]7 p5 e
data2 <- data2[,1:9]5 @: @: w/ C H8 b
str(data2) #删完之后的显示效果是正常的没有多余列
' V) x( l D$ e9 j3 i2 l& m" b/ i* K# I5 N2 K9 P3 B
#2
( Q4 A$ w. k P5 K# k#显示前10条数据记录
/ V5 [/ u+ ?/ [8 tdata2[1:10,]9 ^9 Z' p9 _: k$ _
3 E: a9 a( o/ \. _$ J- a8 d
#3' y, A/ s' [0 m) l' j6 u" ~
#将变量名重新命名为英文变量名
7 G2 {2 l! q) ^- `- w! t8 lcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")0 M; U k8 @! M& v. T9 E" [
colnames(data2) <- cnames0 W& v( b/ p( `8 W$ {/ F
View(data2)% i( P% L; ~; P9 w1 ^
3 O. O" v8 [) ~9 t% z
#4
3 [4 K! s6 [7 v- m# V#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录9 W5 X+ Z; [* f" y8 j8 r4 o( M. l
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth)) l! _4 s1 Q1 C6 z
#View(x2) #①先算出居住时间' G ^: z- `+ |, \& \% ~. R; \
data3 <- cbind(data2,x2)
( {* ?/ N7 H) m9 ~7 t#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
9 @6 [6 t( S$ e( K( Mlist <- which(x2<=0)# u5 l* w! Z7 X) M9 m! }
data3 <- data3[-list,]
" x; r* W* y5 V5 r2 yView(data3) #删除异常数据后是125条数据
4 K" t5 [* m( G
& c- _" o9 `8 I+ X#5. {" J6 G5 _. |) \
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
# w2 c6 B1 k+ i6 S' ?' xlibrary(lubridate)9 O7 I! d5 R% @9 z3 i0 L
date<-Sys.Date() #返回系统当前的时间
& V" E6 D T6 K5 J/ j8 Knowyear<-year(date) #提取年份) P/ J; c7 ~# s$ k8 q! Z
nowmonth<-month(date) #提取月份2 Q2 e8 m/ R U) B0 z. Y
#View(date) #查看现在的日期
% ^* d6 L- w: S. z) v6 Z3 B#View(month(date)) #查看现在日期中的月份
- i: {+ t+ e2 c. H6 _5 Kx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))0 ]7 K2 C$ C9 U& \0 u2 E: M
for(i in c(1:nrow(data3)) ){
& |1 @: v8 R) |$ O% H if(nowmonth-data3[i,"birthmonth"]<0){" _: v9 S0 P y
x1[i,1] <- nowyear-data3[i,"birthyear"]-1
% z% Q3 b4 z* e }else{! y$ s0 I; K- { N1 u
x1[i,1] <- nowyear-data3[i,"birthyear"]- L R0 S' o5 D' {0 T% d$ m8 N
}
7 X/ v! j/ `" W: U* Q}; I) s! F% |) O1 h: M8 A* D6 P
#View(x1) #算出年龄x1,并加入到数据表中
8 u4 e5 i5 m+ Idata4 <- cbind(data3,x1)
$ b5 D0 w7 [: l; p0 J% MView(data4) #加入x1年龄变量的新表展示
, _; j9 F( b$ _% \x2 <- data4$x2
+ Y! }8 x. U8 TMean.x2 <- round(mean(x2),2)$ |# |" F6 f8 [: J: s
Min.x2 <- round(min(x2),2)2 B- m: O+ s! e" f9 F& Y1 I
Max.x2 <- round(max(x2),2)! y, Q2 A1 i+ e w
Median.x2 <- round(median(x2),2)
; Y) G3 U( h6 p& ~+ x$ q3 |Sd.x2 <- round(sd(x2),2)
, N. T# [ o' ^. z1 x- o& Ncbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果" a' t! j2 l7 `9 N% Y2 o1 Q
Mean.x1 <- round(mean(x1),2)
* W3 y" y) E' t @Min.x1 <- round(min(x1),2)$ L3 J/ U) A0 u1 h. r
Max.x1 <- round(max(x1),2)
0 n2 ^5 \) _3 s# UMedian.x1 <- round(median(x1),2)
6 H+ F- c9 ]& t d2 J/ ]! pSd.x1 <- round(sd(x1),2)
2 b6 N1 t9 h" t; A Hcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果6 h" P, Q' y5 S7 Y
x3 <- data4$friends; ^$ s* |* p* `8 H. C8 n5 e
Mean.x3 <- round(mean(x3),2)) ?, C! `. w% M0 A7 }+ T
Min.x3 <- round(min(x3),2)9 i* H! G, J" n8 N
Max.x3 <- round(max(x3),2)
& [9 Q4 l: q) j. {6 d5 L' o; zMedian.x3 <- round(median(x3),2)0 ^& l3 F& F. T* U9 j* b
Sd.x3 <- round(sd(x3),2)4 ? j+ W1 H0 Y A9 b+ z
cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果7 b. \1 ]: o) i5 K% p
y <- data4$salary
f% y% I7 b/ C- _5 w# E; iMean.y <- round(mean(y),2)% F# [3 c. W1 E$ R1 }7 X
Min.y <- round(min(y),2)( {5 {3 u+ m3 d9 G
Max.y <- round(max(y),2)
/ }/ ^7 g @; S8 LMedian.y <- round(median(y),2)
6 L8 i2 l; F* J% l# [& ZSd.y <- round(sd(y),2)
- B& H# R* L* q+ s+ w! R# j$ Zcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
q1 G1 D5 A0 L/ A1 l% j0 H
0 i- ]& l& c$ t- [#6& l. {$ j) P) t6 t
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。8 k5 C7 w7 b4 L% f- D0 K
round(cor(y,x1),2) #y和x1年龄1 ]6 \. g; [/ `. [7 E |0 J
round(cor(y,x2),2) #y和x2居住时间
# a/ Y- o; W9 [3 U6 ~9 g5 hround(cor(y,x3),2) #y和x3朋友数量
0 e4 m$ N, M( F4 ^
0 d7 X: w% y5 [2 S7 t#7
( m% q; H0 ^$ f7 Z. {+ R1 T#分别绘制数据集中因变量与各个自变量的散点图
* p6 f) J# x! L* g! v+ k- h. Apar(mfrow=c(1,3)) #布局,一行画3个图7 Z- n% G! m# q+ S8 d0 j
plot(x1,y,xlab="年龄x1",ylab="工资y")
& [: i& ]0 D, ^2 [plot(x2,y,xlab="居住时间x2",ylab="工资y")
4 ]+ @( P1 J" Vplot(x3,y,xlab="朋友数量x3",ylab="工资y")
$ ]2 ^- n! [: g$ w% l$ S( U7 n5 d& s: F6 T' q8 W
#87 w( n: o0 H7 x N
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。, n& I( W) J$ h9 { E3 s$ G! R
lm.xy <- lm(y~x1+x2+x3)' l7 g& ~% Q, T" r# x" U3 |
lm.xy- x' ]5 X" X2 a5 q6 L, A
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
% P9 }, b9 q# b1 \) p. G* [: a, R
#9
6 ]0 r/ }) s0 |+ _, V#对#8中的多元线性回归模型进行诊断,确定异常值记录。
; _+ l- N$ e' apar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列. r; R. |7 H q
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布' m; x) I: t0 {
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
" y. i' Y2 u8 r#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
+ y7 N4 Z! a3 j; O7 w5 ^5 B#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
* o6 V( P8 w, r* U- dplot(lm)
2 x# _5 k, q5 D- x" ~$ l9 tlibrary(carData)
3 l5 z7 E, n* a* F" w3 |4 Nlibrary(car)
8 X4 U+ N& b- `( Y( goutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
0 D! w$ y, y* J7 C; [5 V& s+ }% y N/ D0 [- I: }
#10
7 Q* ~ N' T' s* f( F3 C#删除异常值记录后重新利用多元线性回归模型拟合数据。' N- s# z6 T9 @. N
data4 <- data4[-136,] #删除该点- I8 o! e) H: k7 _4 S
x1 <- data4$x1
) F# h1 B" r' l x0 Qx2 <- data4$x2/ O u5 @1 A9 C
x3 <- data4$friends }1 d0 ]' A. O1 P4 i
y <- data4$salary
/ C8 I. w9 Q# Ilm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型9 N# d8 z, n2 ~6 D2 U: B
lm.xy2+ ?$ w/ J' e& x+ r( A. K
1 l- e! ~3 n0 I* j2 i
#11
- m8 W5 J! \1 E4 o( S/ r3 G#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
% G' U6 ?6 }$ C1 D6 e. j+ s+ S! g0 O; Ovif(lm.xy2) #p判断多重共线性0<VIF<10(不存在): f1 p# V- j2 B* d
5 a6 u1 i: G6 q& z4 ?4 e#12
+ e- K1 o% n9 T* c2 [#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。# s. u( [" g7 l+ v! f- j2 m
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星/ F; ~4 q$ O8 o3 a3 z' O
2 f& Y) J5 P8 C6 H! E3 b9 ]
**********************************************************************
# k% x3 O6 a' E& }6 h# v; K6 z
2 M5 ]9 c3 `, w& F( O二、利用多元线性回归模型预测收入
+ d/ d1 a: d' M. s. A5 O! Q3 LView(data4) #124条数据
- m0 P- c% o+ ?3 T. C* N( K+ S4 C#10 j0 O5 F9 q' I# e5 g9 g
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。: N- J" X% s0 J: r2 M: E% H
train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
; e- Y! w9 M2 w' N; C StrainData <- data4[train0,] #训练数据
; ?6 }9 ^9 \" c: g8 w& l- f; AtestData <- data4[-train0,] #测试数据9 J! A V( D. j2 t! ~8 o
1 o* Y* c" E* i* s, G* D#2
# \1 W4 b* `* c$ x( u+ ~#针对训练集,利用多元线性回归模型拟合数据。( N; k5 o" t5 M
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])+ P; v5 T% K/ x" b( [& ^) d9 T- h
( J2 l" l5 b8 c% C/ {; q7 H#3
3 H' b4 K) L" M#对(2)中的多元线性回归模型进行诊断,处理异常值。# J* _; A8 F" t
summary(lm.xy3)
8 h7 \; b; O9 |par(mfrow=c(2,2))$ q: }5 T, U5 v0 W$ A P, {
plot(lm.xy3)
. u2 C: m4 J. }4 ~2 r1 ^outlierTest(lm.xy3)
3 c6 u# K0 x) Y+ o% _trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
4 w7 _+ V; i; a6 U# U2 T
6 E* I* t3 X2 F. J2 I. J9 M#4$ R7 ?8 g1 L1 f* J- r1 ~5 {. Z
#对(3)中的多元线性模型进行多重共线性检验并加以处理。$ v5 E1 G; B7 n* [4 w, Y
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在); w4 Q( F- y7 \5 |7 R
salary<-trainData[,"salary"] #引入的数据是训练集的数据/ J6 F! l1 ]" h/ H+ |4 F! m) b* h
x2<-trainData[,"x2"]9 V5 @$ d* T( s' p
x1<-trainData[,"x1"]6 C% c. |' B$ r F8 z# G A$ N3 k
friends<-trainData[,"friends"]
3 A0 [. h4 X) e) V' klm.xy3 <-lm(salary~x2+x1+friends)
+ P9 c! b: a, U+ |
/ m$ \# A. ^/ u9 n5 S#5
4 `! n9 P a% h9 O0 p- a9 V. A9 W#针对(4)中的模型,分别利用AIC和BIC选择最优模型。% n7 B/ K" b# o
#AIC检验,赤池信息准则,选择最小的! Y7 [! t% A! I- O8 B
AIClm<-step(lm.xy3,direction="both")
. v5 K/ [7 c% q: e1 t( y. t#BIC检验,贝叶斯信息准则,选择最小的
: a/ U4 s. f, C% P. u* cBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
! u) V3 V d! [) ~
# W1 T0 p( z3 N* v4 z+ G h- G! h#6# r$ W' E1 V C, B A
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
3 Y0 x9 L; D1 g* N( I E+ v X#这三个模型预测的准确性大小,并进行解释。
* K& k3 H) c1 o7 C: r3 cAllmodel<-predict(lm.xy3,testData)
; J4 q2 R+ c% U |; a0 eAICmodel<-predict(AIClm,testData)5 |- d7 @+ D, l* _; e
BICmodel<-predict(BIClm,testData). n( d# s! x8 i) \; k7 P
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差0 m+ Z! Q2 B/ Y* n3 ^, K! k
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
. T" y. u1 Y& j( t" e; U/ z5 B#标准误差能够很好地反映出测量的精密度7 ^9 c7 w8 b8 T0 S; i ~- r" g
MSE <- function(x){
6 A- ?/ s" X2 x mse <- sum((testData[,"salary"]-x)^2)/50! [! ~1 r) H9 ?8 B. a
return(mse)
8 w8 a3 c1 `* o8 Z9 A}
; f% B3 q- w! P. ~8 gMSE(AICmodel) #AIC/BIC/ALL是误差最小的+ S. r4 _2 l- S
MSE(BICmodel)8 s3 V# R2 g0 f1 q
MSE(Allmodel)/ k: B% I( s3 b: D" t
, A3 E$ s/ Z! r6 U# g2 E
# u( T' Z$ m- h2 r: `7 j
! P) i5 U1 J5 z- q& p, H! ^4 m* Z
|
zan
|