- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40348 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12815
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景
- a- D& V4 j2 M7 ?# E+ f) p数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素9 M: {/ X' P; b" V7 z3 Z* N" k) E
#1
( r6 w, B' ^7 [' S#展示数据集的结构3 Z1 [/ c1 Q) ^1 s ~- @
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
" J0 O4 j* z! E, mstr(data2) #显示的结果有一列是多余的,需要删除- K9 [3 z4 q+ c: Q; w, {' N
data2 <- data2[,1:9]
4 N& }7 d5 S# l+ z- tstr(data2) #删完之后的显示效果是正常的没有多余列
, \3 S% }0 w: |2 U4 F' D" O: m/ Q8 r- c: c Q) G/ q
#2
% B0 l: {( A6 B @% Y2 Z( S, {#显示前10条数据记录
, J* t( I4 `6 m% `3 d* y: C4 idata2[1:10,]8 Y+ b- Z" G1 D& O6 i$ S* V1 ]
r; W. N: \$ N. X/ a& n8 Q5 v% q' Z#3$ [! [8 p4 u+ o# l. B
#将变量名重新命名为英文变量名( t4 A. W; |2 B) U$ R9 ]( n$ `
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")1 b* X; V/ P3 {. ~9 e0 |+ H3 L
colnames(data2) <- cnames
$ }0 s7 |1 x$ P) m- M- IView(data2)
2 n7 `1 M( l+ M1 g6 Z! d& L' ~8 J# k8 f
#4- h) _! j1 y, O0 L( Z
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录# ]% |1 Y9 ~ H. Z- T4 d# |
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
; O- N5 _" e$ _; ]: V5 E2 C# A5 M#View(x2) #①先算出居住时间. _+ S, v6 z" E/ Q: S5 V3 R
data3 <- cbind(data2,x2)
4 z7 A+ G' @; O. O, V( e9 O#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
2 A4 n# I0 k+ H; llist <- which(x2<=0)
* V0 L1 m& U, D4 O8 }* g. pdata3 <- data3[-list,]1 j: m; g, C- T0 z" P. I8 b( Z) ^
View(data3) #删除异常数据后是125条数据) Z6 e* z1 g9 M) P
! N$ p3 m1 ?) ^& c9 Z#5
# [ _* k7 B% i( \2 A% g" ]" q#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。- O! _6 k) K5 }
library(lubridate)& L2 I: p6 C: }5 @
date<-Sys.Date() #返回系统当前的时间& f* D8 L1 E* ?- f7 p1 K2 o& }' \
nowyear<-year(date) #提取年份! B" v# {6 Z* e& j d* \4 _
nowmonth<-month(date) #提取月份
. s, F; V' H d#View(date) #查看现在的日期$ S' x, u% R- S* V
#View(month(date)) #查看现在日期中的月份
0 T4 C# y7 F3 K9 ^x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
- [2 _7 C; m) Zfor(i in c(1:nrow(data3)) ){
/ t- c. s$ p+ ^8 j& g* j if(nowmonth-data3[i,"birthmonth"]<0){
/ ~6 y: z, Z7 Q9 Q% ? x x1[i,1] <- nowyear-data3[i,"birthyear"]-13 {9 s* u5 L+ i+ e' V
}else{: K4 x' f. G4 y6 u
x1[i,1] <- nowyear-data3[i,"birthyear"]9 k8 V3 D0 w6 V
}
- |* [( X! q7 K% f7 Q7 H}/ j; _ E1 G' ]3 ]& e
#View(x1) #算出年龄x1,并加入到数据表中, z' o( Y6 L( o( f
data4 <- cbind(data3,x1)
4 ^( ?2 q r1 @9 \2 m5 @View(data4) #加入x1年龄变量的新表展示5 M5 N, G! [) ?' x
x2 <- data4$x2
/ B0 V* [/ k2 \' p) T: JMean.x2 <- round(mean(x2),2)
` h" F' f4 O: ?( M$ A8 s, IMin.x2 <- round(min(x2),2)/ I. Q# A& e: W. b- n) ~5 I3 e- o
Max.x2 <- round(max(x2),2)
" `; [% I) I6 e; QMedian.x2 <- round(median(x2),2)1 F/ x% @( m5 s/ ~/ h
Sd.x2 <- round(sd(x2),2)
3 g9 Z& g4 x }0 G: P* H# Hcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果- D" N4 b- y6 E% R0 v
Mean.x1 <- round(mean(x1),2)0 E# ]. R' t% ^" r
Min.x1 <- round(min(x1),2)
8 Y; M' f* ^3 p, @; DMax.x1 <- round(max(x1),2)# {3 h/ N$ A% H4 g
Median.x1 <- round(median(x1),2)
8 B3 f% Y$ \0 O8 iSd.x1 <- round(sd(x1),2)9 @' h% b+ c# _$ |2 x7 Q
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
1 U! q: c; s% j+ ?x3 <- data4$friends
% J% N( }) W4 L. K( w2 ]; dMean.x3 <- round(mean(x3),2)
2 J: z4 N, N) q3 BMin.x3 <- round(min(x3),2)
% l( d) M4 p" } |9 jMax.x3 <- round(max(x3),2)
" |, R9 R+ o: s' q7 U t# c& }Median.x3 <- round(median(x3),2): d8 x: C, ^5 n7 w0 l
Sd.x3 <- round(sd(x3),2)
% `$ Z p" X& W H) k/ v* rcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果' P; `- s: J C
y <- data4$salary( G3 U4 ~# I* l8 q1 S6 B
Mean.y <- round(mean(y),2)
* A! ]/ Q, O+ o; n6 y8 [6 j* OMin.y <- round(min(y),2)
& j+ J# d# l: P3 K& [Max.y <- round(max(y),2), L. Y! O5 { C; v/ x
Median.y <- round(median(y),2)# |! G3 e9 f/ W J3 E x& h5 H7 \
Sd.y <- round(sd(y),2)# Q% v) I( H+ ~* I: n1 N
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果/ t3 S5 @* Q: J+ S1 v0 f) O
) n) I4 t( ]) }#6
% C6 F# D! e" e* h& T4 H1 H$ W#计算数据集中因变量和自变量的相关系数,要求保留2位小数。. D# M* h) ^4 A1 W: T
round(cor(y,x1),2) #y和x1年龄; V. F3 V% x! u+ [
round(cor(y,x2),2) #y和x2居住时间" {8 K, B+ R+ u1 b/ a9 U: r; M6 o( L9 ]
round(cor(y,x3),2) #y和x3朋友数量8 l5 J. R* J; x
! [' v2 V0 D8 T1 ?
#78 |4 T" R% ?. S; z5 Q
#分别绘制数据集中因变量与各个自变量的散点图( y: y/ s1 e' b6 W# I3 U
par(mfrow=c(1,3)) #布局,一行画3个图6 W1 D9 N7 I3 |
plot(x1,y,xlab="年龄x1",ylab="工资y")
& A7 i" `0 e! y/ tplot(x2,y,xlab="居住时间x2",ylab="工资y")# j1 E2 P' K2 f- L; k! W9 ?
plot(x3,y,xlab="朋友数量x3",ylab="工资y"); X0 q( t6 ?7 J5 }+ D
, w- l* r {* c1 o& U. t8 X' l2 J
#8; L; x) W; U( p `
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
3 X: C' {/ q. H* S. Llm.xy <- lm(y~x1+x2+x3): U5 z% M$ Q, s2 \, D4 W) |8 H4 u/ y3 N( d
lm.xy
7 v( @* B1 C8 h2 isummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的4 s- l- X, n4 n! s1 }
% p- Z3 m* P: x3 U#9
5 c4 L' r# j: B3 d* y& M#对#8中的多元线性回归模型进行诊断,确定异常值记录。, X1 n" V& O4 B* w8 j: Q4 g
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
. v" R1 O3 @) O$ V% P' u#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布$ ]3 g( [1 M$ i
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
" T; M3 ], Q. z- ?+ | c#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
$ J/ t$ d7 A3 J1 V0 E#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
f$ D: L" h1 a& I+ Cplot(lm)
/ s& k$ }! x; o: g9 ]6 Flibrary(carData)
7 k7 J3 i; _9 ~5 b1 o1 Alibrary(car)
1 n* `8 F8 }4 j8 Z% M( U8 p) h% VoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点4 s# N4 l h, f! j% M/ Z
0 O/ v. w! g* s6 s8 K, e6 M M$ Q#10
) S" F) y. U9 _2 r#删除异常值记录后重新利用多元线性回归模型拟合数据。
1 v3 R# Y N/ z8 z9 F) m& ^data4 <- data4[-136,] #删除该点( O3 R; v; Q3 k2 H6 ]
x1 <- data4$x1' {* z4 H% U8 D: Y" o0 F& K
x2 <- data4$x2) f6 S- H2 p( q3 Z/ X
x3 <- data4$friends. s1 E6 m. I, o. T4 Z2 k
y <- data4$salary7 t1 Q6 Y5 `. D
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型: u$ @' p: k. B
lm.xy20 A/ u# ]( j$ i, L; P- o
8 ]% t$ |9 T0 \, m% P" b* B* D9 T/ U
#11
6 C, T5 a, a' { z- e: l#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
9 G4 `' j2 k5 c* m) P) ^- Tvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
: v+ a: j4 E4 f0 s( V+ h D$ w- ]7 o6 F
#12
, ^4 b& Q& B u. j! _/ |2 @/ C#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
/ V5 W$ |: H3 U z0 H e$ J4 Y8 ^* ]summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星3 t/ N4 v8 }' w2 E$ ~' y' Z- p
! Y7 R8 F$ W) L- p1 d**********************************************************************4 T4 y: U: ^3 \4 l
( `4 q# T& v; s
二、利用多元线性回归模型预测收入
$ O/ k, y* F4 _4 u- f9 M1 m8 i+ _* l* fView(data4) #124条数据) Q+ r) x$ P, j
#1
" ~. \/ u/ j& [1 f X#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
# g5 `( S" X/ z3 ktrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集. O- ?* U: q9 R8 l! P% |- J$ L
trainData <- data4[train0,] #训练数据
7 `8 j" ?9 w0 b( _/ d* \/ UtestData <- data4[-train0,] #测试数据8 \5 M0 M* t" k
! D. v4 p g# ?4 |# o
#20 G$ n& f& |' s+ A E: }! `
#针对训练集,利用多元线性回归模型拟合数据。
0 e) C- ~5 u( k' h* K' Dlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
, P; u0 b" O# n4 Y% m1 ?
; n1 |7 A2 ^ I: @) l#3) l C( x/ x) R6 m6 G6 l
#对(2)中的多元线性回归模型进行诊断,处理异常值。7 z1 |2 v* S( c6 u D$ _0 f5 M( X
summary(lm.xy3)
+ L# I1 P0 E3 Opar(mfrow=c(2,2))2 O3 {8 D8 B4 I1 t" Z
plot(lm.xy3)! ]8 H) Q* g2 Y, D6 E' Z
outlierTest(lm.xy3), w7 r f- l. U3 P. R% `
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的1 ]7 L/ v, ^* ~4 L9 U
7 a6 p* g+ n, F( l/ c: y#4
+ `) ]3 F4 K: i" _1 s, Z#对(3)中的多元线性模型进行多重共线性检验并加以处理。
( k) g" E) b/ E( u D& Mvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)' x8 N2 i& q- W& K# Z0 b
salary<-trainData[,"salary"] #引入的数据是训练集的数据2 h% U6 L" W H: Z7 d+ u
x2<-trainData[,"x2"]
# c/ Q% |1 T8 lx1<-trainData[,"x1"]
/ y- `# |% N/ v8 y* `+ h {friends<-trainData[,"friends"]3 U. T$ J2 o2 Y' J0 L/ r
lm.xy3 <-lm(salary~x2+x1+friends)
% M& B0 n N6 I6 v1 Q
& S& @2 J3 C( f6 t" _#5
" r( ]- z4 h! P9 s% X#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
" P3 M {% {9 P#AIC检验,赤池信息准则,选择最小的
5 J' a. R1 V' H% k. mAIClm<-step(lm.xy3,direction="both")2 i8 K! W7 E) x1 J0 C, u! v
#BIC检验,贝叶斯信息准则,选择最小的: q( E+ J2 Z8 Y
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both"). V7 Y O3 c# U' t) J" f
G! j# ?6 o4 r2 _+ o#6! I& y8 c( p5 u$ Z1 R( Q
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型0 W9 a& j4 T( h6 S" m9 ]
#这三个模型预测的准确性大小,并进行解释。
/ |& g( f6 Y$ i/ E' VAllmodel<-predict(lm.xy3,testData)
6 b, @# h, J7 f1 ~0 C! LAICmodel<-predict(AIClm,testData)/ t. I" Z; q4 d8 `; u8 N% ?
BICmodel<-predict(BIClm,testData)3 Y$ c/ B% _4 q1 o6 Q* u z1 U4 A
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差7 p: H q& @' D* r2 i# i3 y
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
: Z2 P E' q3 D3 F' r#标准误差能够很好地反映出测量的精密度- E: g- N3 M3 X1 R
MSE <- function(x){2 ]1 ?' B% r; R( i
mse <- sum((testData[,"salary"]-x)^2)/50
2 X; o: {' {% ?* j" M return(mse)
" u" T# A4 d) `" u}
- P2 h5 ?9 c3 c! ]5 _. JMSE(AICmodel) #AIC/BIC/ALL是误差最小的# P* M! E# k/ U, C
MSE(BICmodel), G; E& q% t6 @
MSE(Allmodel)& {& i: O) r& ^
8 ^4 G. F! h1 q! [7 J" P7 |- r
. P) ?& U0 i5 J- A
5 j' O% T F6 a& r: v |
zan
|