- 在线时间
- 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 多元线性回归 一、背景
) w8 M. l4 h- U/ o) y% K数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
; S- [4 k! \# \! b h- c#13 G3 u) j1 W. J8 U) }
#展示数据集的结构
. B) l1 d/ O+ b. |* Kdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")- @. @+ ~* N+ W* B w5 Q
str(data2) #显示的结果有一列是多余的,需要删除( q7 B; R- u/ T7 f* s( \
data2 <- data2[,1:9]
# p) I9 P- Y/ S- q- _" t& Q+ r; _str(data2) #删完之后的显示效果是正常的没有多余列
/ W5 z7 H1 S _ n' x* K- C0 _9 m6 I$ g: j
#2
$ m. E; B' \2 V. G#显示前10条数据记录
0 n( L1 ?/ N% N8 f' U! qdata2[1:10,]
0 K/ ~# z% e* q; s+ R, M
- V/ P. F' r7 B# m% S b9 g#3+ L0 a R9 P H& a; E
#将变量名重新命名为英文变量名
9 Q/ n! J# H- V+ s* ycnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
3 b+ {$ m3 s3 k* C! Mcolnames(data2) <- cnames! w+ B" i7 D: h+ W
View(data2) q/ J2 r* |9 W& H* A# K; [
) p9 A8 l- O& u
#4. U0 Q2 M( h7 c3 \2 `- N9 e
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录' d; b+ U" x9 {/ E7 Q$ s0 H0 F1 m: ?9 u
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))0 j- _" m& D( T4 p% |2 g
#View(x2) #①先算出居住时间
9 x' ]6 `! [; f U7 z9 e$ S1 edata3 <- cbind(data2,x2)4 @& s, x- T, {! k5 G: M; }
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条1 K% ? u+ P; C9 h8 n- v7 P
list <- which(x2<=0): p& x/ O. @: v; T) x
data3 <- data3[-list,]
" ^) X' ]' I! t$ P+ M6 I6 KView(data3) #删除异常数据后是125条数据
. E' L, q) T) A- E# L" F% p( ^- p+ g8 C1 d5 G1 b6 L7 c# y) t6 t
#58 ?/ T' O1 M0 z/ Z. N* P
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。, S \5 b' G8 A. q% Z' j9 E
library(lubridate)( n% \3 `( f+ _) W( Q% }" _7 L
date<-Sys.Date() #返回系统当前的时间1 n4 T4 a6 A/ ?# b! W6 i& A
nowyear<-year(date) #提取年份# e" U! B1 D) _* l/ S ]
nowmonth<-month(date) #提取月份
* ^5 A% R: T: s. l5 R#View(date) #查看现在的日期. ^/ d/ K) w. U/ T# e. {( D1 P- K
#View(month(date)) #查看现在日期中的月份% V& S5 ]( }& x* s; [
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))4 u( ]0 u* Y. ~
for(i in c(1:nrow(data3)) ){; T0 w" F+ f& g/ T8 d
if(nowmonth-data3[i,"birthmonth"]<0){/ ^: W" p5 [5 G$ e# N# ]
x1[i,1] <- nowyear-data3[i,"birthyear"]-1+ Y* ? j4 z( Q
}else{ c h0 Q( e6 ?8 k. s* n6 k
x1[i,1] <- nowyear-data3[i,"birthyear"]
* I- Q+ O6 M- \& \5 b4 x' p8 p+ i }
9 I$ p3 i# f* `3 K( m+ t: @}( _7 E( a( i* W1 h4 R. i% ]
#View(x1) #算出年龄x1,并加入到数据表中& \0 q' @7 N1 f
data4 <- cbind(data3,x1)
% d6 L5 m- [# p \" IView(data4) #加入x1年龄变量的新表展示# j' D* c; E8 {; E3 \+ }
x2 <- data4$x2
$ n: e" T! a* a( x3 k1 \- |Mean.x2 <- round(mean(x2),2)
' }" f! u' `( N# w2 [% d7 iMin.x2 <- round(min(x2),2)
1 ^' r f7 X: B0 O1 A! M* ?Max.x2 <- round(max(x2),2)
6 n" n6 R- q* P; L9 bMedian.x2 <- round(median(x2),2)
% y4 w/ ^% D3 M1 l# m) e2 o+ d/ Q8 sSd.x2 <- round(sd(x2),2)
& T, g3 K, K& M3 F- M; g# u& xcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果$ W6 Y* @ y7 f K& U/ F) b& _" J
Mean.x1 <- round(mean(x1),2)7 D; M# A, M1 _6 z$ Y2 D
Min.x1 <- round(min(x1),2)
0 o, ^* `8 C. S$ U# p w" `. YMax.x1 <- round(max(x1),2); N+ \5 B! ^6 W1 f8 q5 v
Median.x1 <- round(median(x1),2)
Q. D* w- ]% a6 L# g& I2 SSd.x1 <- round(sd(x1),2)
, G% F& ]- f- \$ rcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果 ]' Q* b$ u2 d! Z4 ]* G: y; C
x3 <- data4$friends
* G6 ]9 ]) o2 Z! EMean.x3 <- round(mean(x3),2)8 D6 q% e3 w$ \9 w+ e
Min.x3 <- round(min(x3),2)% ?, J* E7 ]/ G
Max.x3 <- round(max(x3),2)
8 o9 k; ]* L R) [- Z7 FMedian.x3 <- round(median(x3),2)
+ ?+ |. U/ ]* V0 O; ~7 sSd.x3 <- round(sd(x3),2)6 P4 ?/ C2 y" C4 \2 W" e
cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
1 d' l* M% R/ K3 Zy <- data4$salary
' `3 V! }' w/ f5 s1 b8 O. w+ ^Mean.y <- round(mean(y),2)
/ D* `- }, s/ [ |+ A' H5 e! }7 r" FMin.y <- round(min(y),2)
: b, U0 F- ]8 I0 g1 v% h- _6 D$ gMax.y <- round(max(y),2)) T9 j7 r+ j( `: \
Median.y <- round(median(y),2)
0 t' Q3 h) k0 ^* oSd.y <- round(sd(y),2)
& x& W8 B3 S. H4 ~cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
1 t3 q1 }7 L5 w( d0 Y8 f$ {* Y4 e8 }' @+ W' d' Q, Y
#6
h, p- E0 Q% k; N#计算数据集中因变量和自变量的相关系数,要求保留2位小数。/ W3 J9 o3 V- L
round(cor(y,x1),2) #y和x1年龄! W; d- I% ^; l7 \, _* t+ j0 U' Y
round(cor(y,x2),2) #y和x2居住时间2 K+ h2 X9 I% M
round(cor(y,x3),2) #y和x3朋友数量
( K- c0 p* G6 u j; y9 ~$ _3 }1 b- P% W
#77 C8 J/ @2 n" B \! S& o' W
#分别绘制数据集中因变量与各个自变量的散点图
) K5 e/ Z0 t) C& X7 ppar(mfrow=c(1,3)) #布局,一行画3个图0 Z3 z E( |, Q' @4 n
plot(x1,y,xlab="年龄x1",ylab="工资y")3 D. V% H7 V! A# P* {
plot(x2,y,xlab="居住时间x2",ylab="工资y")
9 T' U; }7 | k1 Z+ v ]$ g/ e2 ~. |plot(x3,y,xlab="朋友数量x3",ylab="工资y")2 U! ^3 [5 k! b Q& \3 G
% F( C3 d6 g* ?8 v# m( K- \4 g# {
#8
# Z7 I6 G* R3 q6 y/ X/ I* @6 W+ m#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。" r# t5 L/ s; A- ]7 Y+ S- k
lm.xy <- lm(y~x1+x2+x3)
. h' l* o% ?! X. F* s" X" Elm.xy
' t, q' `" W5 c( `$ g; Z) I& w8 lsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
( a# `9 \- \. b/ Q6 ~
0 x5 D8 t/ `( n, W# R#9
, x- {+ s5 y" W6 v#对#8中的多元线性回归模型进行诊断,确定异常值记录。
9 a, f+ W5 q5 l. k% `( \par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列8 ]; |- @3 b) E- Y, R% i, i
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布7 }# P1 X8 E4 G
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
. U' I% S" J' ^. a. H1 X#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。2 r2 T; t/ c! z9 i/ ^, `" ^
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。" H8 x, o& |! h0 m$ r L
plot(lm)
# o* ?% h9 T) Wlibrary(carData)
8 L- B9 Y- t( o5 }: e/ a+ v8 o: Rlibrary(car), k" h5 e( T9 a5 \5 `! T0 e9 Z
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点2 j2 A' R. J4 o T& C3 ]( _* A. g
3 T7 h* V4 Z/ s1 R1 k+ f0 K#10
c1 k7 y, Q9 p6 ?#删除异常值记录后重新利用多元线性回归模型拟合数据。; e% Z+ e% ~5 |- n
data4 <- data4[-136,] #删除该点' v' x1 _ H2 c! ?
x1 <- data4$x1
& H# ~0 W4 y2 u3 o0 {; P1 N! C8 hx2 <- data4$x2) x! h' S# t5 Y6 p
x3 <- data4$friends! X$ i1 C* \3 C. b
y <- data4$salary; q9 L! s9 [3 r$ I
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
! q( J6 b- n4 p/ j% Dlm.xy2) p( G/ f% ]5 T5 s% G8 H6 d, D+ h
# |/ i! z! R9 A
#11
$ L7 Y7 `' o: N% }, R9 ^" a#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。; u' P; G1 u$ O8 v9 G
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)1 K/ I; L9 p& U4 h
1 b, C& s. ~0 i7 z6 D( q& S8 L
#12" h( {5 k2 l0 z/ X
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
7 x6 n$ K/ i ?8 _6 ]summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星/ }' p3 o5 e' Y4 P/ _ L- c
; G+ a9 g! P/ K2 M) r8 q**********************************************************************
z1 M# }' f. g! c" z" Y4 C# L
5 ~& R, U0 @4 m1 _) j二、利用多元线性回归模型预测收入/ N. ?* ~! {5 o$ z& l
View(data4) #124条数据# }6 Q. X& g1 V
#19 C9 r; f1 o9 ^, }6 A5 Z
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
3 h! h4 U$ ?" r* V: N! F! D* ^train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集+ S) F+ ]6 k7 m7 w5 c* [
trainData <- data4[train0,] #训练数据$ k) p: v# i7 p; V; _
testData <- data4[-train0,] #测试数据
0 i Q4 b9 `0 x6 B G
" ^# N1 k: D; j#2 k9 G5 G y6 F1 {
#针对训练集,利用多元线性回归模型拟合数据。$ [* p( A' j" _0 p" [( b
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
& r/ f5 r$ p$ k4 H% F; x8 L
' U# `0 k- Z) g/ v/ s; T: K. g#3
% M" A8 u! `8 n' S8 a& N' F E* M#对(2)中的多元线性回归模型进行诊断,处理异常值。* s2 s! y* r2 d( `2 V0 ]
summary(lm.xy3): @( J. T5 k) g
par(mfrow=c(2,2))
4 x2 u( B; t4 N/ u1 v% K2 nplot(lm.xy3), M, V1 j) k/ j M+ i( ?
outlierTest(lm.xy3)/ D, X2 |) ?. l
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
N/ P+ m) @ v% ]* R4 T- p
& K% G" D5 A) k+ r, R6 y#4
) G; i+ k' \6 G#对(3)中的多元线性模型进行多重共线性检验并加以处理。5 Q. ~% y9 c7 q. E7 e- h( o2 Z; v* }/ l
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
& O4 Z v" f- m6 K0 fsalary<-trainData[,"salary"] #引入的数据是训练集的数据& T! o" t8 D2 k$ O
x2<-trainData[,"x2"]: {' p9 C+ k" D+ D6 q3 G9 e% ]
x1<-trainData[,"x1"]
; j) [2 J2 E/ s2 c1 e1 U; ^friends<-trainData[,"friends"]
+ q* X9 c/ c1 A# Z) flm.xy3 <-lm(salary~x2+x1+friends)
0 _; b8 P6 F9 Q1 ]! m+ o2 i4 I
( w6 P6 C4 C' {! @; W6 n#5
5 O% u6 x& W( N0 ~7 L# j2 z- R; I, b h#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
: V3 I- o4 s5 H6 t8 F#AIC检验,赤池信息准则,选择最小的
# j$ O+ N- s! L& Q" w" }AIClm<-step(lm.xy3,direction="both"), Q q, @* X% e, ]$ \6 R- h
#BIC检验,贝叶斯信息准则,选择最小的
- C0 R5 H. a2 Z7 x: V% rBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
& |4 E+ y9 c# s6 Y/ K' Z9 a+ |- c3 C* e" ^: r
#6* P- C9 a8 G( w# s0 b, i
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
. P @8 L. g" N) T$ z( y2 G% q4 g$ c#这三个模型预测的准确性大小,并进行解释。
7 ^4 Y r# t b: f1 tAllmodel<-predict(lm.xy3,testData)
6 B' ^. r, p I CAICmodel<-predict(AIClm,testData)
& t# A4 a4 y2 |. g4 ZBICmodel<-predict(BIClm,testData)
$ x0 J$ Z7 d. V$ D% Q#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
; z2 x- B' d* V, ^4 Z#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
) g2 N* g4 H. i8 x3 \% N0 U#标准误差能够很好地反映出测量的精密度( R- c) N W! r) W4 s0 }
MSE <- function(x){
: C3 Q& h7 v0 W' Z mse <- sum((testData[,"salary"]-x)^2)/50
- d3 u* ~" O8 r% n' Y return(mse)
2 c7 K1 u9 D& T$ Q4 c0 v) s}4 N( T8 J: k, g8 y
MSE(AICmodel) #AIC/BIC/ALL是误差最小的
: M+ V% s3 K! e1 ]MSE(BICmodel); c2 U& X+ N% q* [& D3 q5 ~
MSE(Allmodel)
7 c- N# L+ j0 N# Y( P
3 F6 j: E+ q- R% v( f# V8 p z& C) r" p6 I4 |+ I: C l3 ]; G; f
. B3 M: p2 X) k1 t5 a1 L) }4 f v* L |
zan
|