- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40102 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12742
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
【高级数理统计R语言学习】2 多元线性回归 一、背景
8 z1 H0 @* U k0 m4 ? V数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素3 J+ W! A/ Q/ e( [5 ^; l
#14 w) r- \- w7 F3 y4 N
#展示数据集的结构4 p* P4 ]; F- \4 j8 G
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")* H2 Y- `0 q; Q5 j [" s4 Z
str(data2) #显示的结果有一列是多余的,需要删除
8 g. A7 a, k( `! g# e8 W- zdata2 <- data2[,1:9]
3 a1 R! n+ O# ^3 k( o) M$ V, Mstr(data2) #删完之后的显示效果是正常的没有多余列9 w- c. g0 A% @* K" \) f8 b) m
+ w1 _3 a$ Y ~
#2
/ V" e# R- G' }' Z- s; r4 G& ]6 h* g#显示前10条数据记录
2 C/ G R. j% I# K, {data2[1:10,]" K4 a. M' _* [+ G
, N3 E6 U, J6 Y. ~' d: d#3
! d& T1 f( q+ I6 Y5 n9 ~' H( P#将变量名重新命名为英文变量名. o/ D% O) t% H* a' {
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")9 I$ F6 ?0 x3 H& X9 w0 m
colnames(data2) <- cnames
3 ]! g+ S, a- u3 FView(data2)
, e: b9 `, ^* M; J) C9 Q# J H) Q" v! a! Y* F
#4
6 W. M/ H7 e. S) l) D#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录( n5 }: g- W( t3 T; c- A
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))3 J4 @; N7 f, ~: F
#View(x2) #①先算出居住时间6 P$ L- e6 l+ w& d3 U
data3 <- cbind(data2,x2)
- P2 H- i, Q8 J3 o3 T1 ]#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
. s- E" ~+ \. `2 c* i( k; Plist <- which(x2<=0)
# `# g7 |3 m) Z- Gdata3 <- data3[-list,]
. V9 [1 ] m3 ^4 t6 }7 ZView(data3) #删除异常数据后是125条数据
( | k# Q! x9 v5 }; l
& A) f! }+ f4 K! N$ t T#55 Y/ n5 p5 ?& g2 F; Z; _; D
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
, B$ H) n5 V7 y+ xlibrary(lubridate)
3 v* r$ B* i% P/ }8 Tdate<-Sys.Date() #返回系统当前的时间
! u4 T+ G: w8 Z# M4 j5 D9 Inowyear<-year(date) #提取年份
( X4 x; l G: S. m: Inowmonth<-month(date) #提取月份
1 C( n4 y ?8 e, s6 h( L& _#View(date) #查看现在的日期7 E. w6 c& p0 w) T0 Y0 b& Y* w
#View(month(date)) #查看现在日期中的月份
- N% p0 Z& c; |3 Ux1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
1 _& [/ t6 n( K' f! G- R. gfor(i in c(1:nrow(data3)) ){
$ z9 F8 g) j$ G: [" b( q0 ^9 A if(nowmonth-data3[i,"birthmonth"]<0){- `9 [/ k- N7 e3 l9 N
x1[i,1] <- nowyear-data3[i,"birthyear"]-1
, b3 [* S0 y/ R0 R2 ~+ U y ^ }else{
- r) z: v3 {& B; k& S x1[i,1] <- nowyear-data3[i,"birthyear"]
3 [8 j2 K+ C- v" s4 l }& w. d( _- l5 b- J3 ^
}
& z8 i2 m* X. L! [1 [* U$ { {' U#View(x1) #算出年龄x1,并加入到数据表中$ \8 e; U; O' F7 w. ^
data4 <- cbind(data3,x1)
1 W6 X$ p3 d& N# uView(data4) #加入x1年龄变量的新表展示1 U/ z7 a* o5 u% n/ O
x2 <- data4$x2
7 e! \# H h3 ?Mean.x2 <- round(mean(x2),2)
1 }- h5 K8 f; {- X8 f' _Min.x2 <- round(min(x2),2)8 h1 T! J [4 p P8 ]
Max.x2 <- round(max(x2),2)5 J( B7 _' ]- y
Median.x2 <- round(median(x2),2)
0 X" i8 B7 k: ASd.x2 <- round(sd(x2),2)# O, }9 a) N& z9 Z: t
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
8 y& t9 ^. J, v; t* N) sMean.x1 <- round(mean(x1),2)
4 V% s4 Z% ]2 [0 t# M! g# UMin.x1 <- round(min(x1),2)
3 P9 _( X9 Y1 x. \, gMax.x1 <- round(max(x1),2)9 v& E- _. S( P, I& h; F0 s+ g8 r
Median.x1 <- round(median(x1),2)6 G9 X- u8 z7 N' J3 N o L
Sd.x1 <- round(sd(x1),2)6 t" F% Q; y9 f$ `" o- j
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果8 }1 E: w4 }$ l4 m
x3 <- data4$friends0 f5 M" H" l2 n5 [8 I
Mean.x3 <- round(mean(x3),2)8 M/ m a& K, X5 P
Min.x3 <- round(min(x3),2)% V' x$ R+ r. y' V* }
Max.x3 <- round(max(x3),2)
$ \; E5 y" c2 aMedian.x3 <- round(median(x3),2)
3 X0 J z1 i1 k( e7 @8 ~Sd.x3 <- round(sd(x3),2)
& `& ^- R2 K; H; B& b& ycbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果1 x7 u3 T. y; J0 }
y <- data4$salary
* ~: w) d* z" h5 b. jMean.y <- round(mean(y),2)% _& Z* x& Q8 G7 \, s6 A0 w* m
Min.y <- round(min(y),2)
S3 ^6 f) c- A$ r& l. M' YMax.y <- round(max(y),2)2 |; M' p0 B( ?, [
Median.y <- round(median(y),2)6 e. j$ R& R. u4 ?" x9 _
Sd.y <- round(sd(y),2)
7 x1 e, ~7 R4 ~ k4 z' i$ |cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
+ o% [. i, B5 B. }! ]
1 w; u' O4 m. E5 a4 E/ ^#6+ ^$ a- n, r1 ]
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。8 g: e% f/ ]9 p; y+ Q7 T
round(cor(y,x1),2) #y和x1年龄1 d# h" ~6 r% {- k* o, i5 f
round(cor(y,x2),2) #y和x2居住时间+ g* J# n( H$ N/ E4 ?7 R( }
round(cor(y,x3),2) #y和x3朋友数量
9 M; ]/ S8 W% j0 C* S5 Q$ ?. J( ~& g
#7 f* j; @7 ~7 F9 D
#分别绘制数据集中因变量与各个自变量的散点图
* F* H- H' m1 epar(mfrow=c(1,3)) #布局,一行画3个图
7 j. e% Q4 U* H9 rplot(x1,y,xlab="年龄x1",ylab="工资y")3 S6 ]; V* @& F! U
plot(x2,y,xlab="居住时间x2",ylab="工资y")2 \0 l, M1 i# Z/ I9 J! n
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
0 l4 z/ N/ M6 h5 b$ U) j& A% m- M5 N/ b( G3 I0 i" U& L% n4 V
#8
$ J7 l& Q0 n% A, q#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。# t' s& K5 H- w6 }2 {7 C& b' H1 `
lm.xy <- lm(y~x1+x2+x3)
7 [9 k* b/ j3 M% y( h) b+ L5 Dlm.xy1 m# i* a* O6 v/ ]' Y: \0 P
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的' t- q% M5 p! ~* E6 H
- ~% r: a/ e: z* Y" Y#9
/ s" I/ v! U% R8 o) _: l2 Y! i- P' w#对#8中的多元线性回归模型进行诊断,确定异常值记录。
* b/ _* \& p' g5 U& W: \par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列4 E& J; w% x% V/ k
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布, [. W, s j; z, E+ D& ^ Q7 w9 e
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
- ^* w9 K Y0 K4 @4 \#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。5 q3 L3 ?8 ^' U. q( Q
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。8 U) J. m+ }, O6 k( Q
plot(lm)- o) R% W5 M* @+ K
library(carData)
( Y3 G6 T! _2 z- [4 C; s1 dlibrary(car)
& ~7 y! y, O/ goutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点, J# E6 A8 M& H% ]
, r' v' Q, l0 v' |, z: W( n2 T
#10
7 K) E$ J) K, U#删除异常值记录后重新利用多元线性回归模型拟合数据。5 @3 f- x; r/ _% k0 y* F
data4 <- data4[-136,] #删除该点
* s7 ^4 z8 V. s! r. Q, px1 <- data4$x1
+ p' f" i6 c; ~" p% c2 i' Vx2 <- data4$x2
* m ^8 I8 m4 X6 U* Zx3 <- data4$friends( W, s3 r; l; V9 J* n q2 v
y <- data4$salary# v5 n7 n) [) ^, |
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型5 b9 D( `8 P# [3 o- ?& S$ H
lm.xy25 y) E3 E- H) d, u! g( Z* e/ Y
) {5 ?/ q; v0 O: E3 [+ v#11/ L/ ^; O9 N: |
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
( w) z9 }0 o. P9 S) C' ?, A+ lvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
: i- `9 E6 d1 f4 ?+ K4 `$ x: I' {9 E6 o# x; X# k7 J9 N+ `4 l! ~
#12
* ^6 y+ [3 C, l, E4 x: v; w& j#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
. R+ \6 D/ |7 X5 O" c n8 }' dsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星! c, i5 [/ H# P& j8 Y" k) u1 R
/ d$ T3 @* r6 [ H2 m# Z" W' q**********************************************************************/ M- _ u* B& a5 d
% ? T# ^; p$ {6 ^+ D二、利用多元线性回归模型预测收入/ ^5 n. l/ A1 X
View(data4) #124条数据8 P; w+ f4 Y% T8 {3 R
#1
0 c' C* {% _, Y" ]4 w#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
& z% B. c/ W j3 A# n8 g6 Ptrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集* @; N9 E* x t* l8 D# Z
trainData <- data4[train0,] #训练数据
: X* i' [8 a# _( i+ E6 D4 ^testData <- data4[-train0,] #测试数据
; N: `, u r: `% j3 y2 f3 f9 w0 M, C' t7 }8 m& i
#2" m1 O" E* q8 B9 X% o1 W4 W k/ N
#针对训练集,利用多元线性回归模型拟合数据。
3 A7 F" ~3 t5 U% b3 ]4 g: W k2 slm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
; C6 u& Q2 z5 M9 S) \; x4 C2 V8 \. u& f8 ~1 c& v4 V h8 _
#3
9 W" |, _1 r$ x9 d7 q( A j#对(2)中的多元线性回归模型进行诊断,处理异常值。
; ]3 C4 i/ M2 g: `4 V: I D( |summary(lm.xy3)
' h- P$ H! b! j% Xpar(mfrow=c(2,2)): j8 D& o- R! a
plot(lm.xy3)) z) p0 p; T% W$ W
outlierTest(lm.xy3)
1 M z$ T a9 J$ n8 KtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
" u" _; I* D, I2 ^/ E) y4 a3 o; F" H& N# E/ ]; A* c( m/ Q
#4
( R9 U4 F9 ~7 a. a( b- f#对(3)中的多元线性模型进行多重共线性检验并加以处理。/ B3 f5 J/ l, N" L7 Z8 Y
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)3 {& `. z9 h6 Z2 J' g
salary<-trainData[,"salary"] #引入的数据是训练集的数据
2 v' @/ X! W1 l$ x3 C9 i \; _- Sx2<-trainData[,"x2"]0 f, _3 w, R) {4 s1 G/ l4 r
x1<-trainData[,"x1"]
, D3 ]& P5 ]: w- V4 ^8 T, X) h Qfriends<-trainData[,"friends"]/ v! C) O$ `2 f- t
lm.xy3 <-lm(salary~x2+x1+friends)( Q, Q8 h& y; N4 [: Z _' z1 g7 s
7 `2 w6 B0 @) k4 d) A#5
( g; m/ W' u2 \. G2 c6 U#针对(4)中的模型,分别利用AIC和BIC选择最优模型。2 q2 } d; H: x( c% L# ?. x
#AIC检验,赤池信息准则,选择最小的
$ E' R+ O# ^4 {- S% x9 |AIClm<-step(lm.xy3,direction="both")- G6 o5 h+ n! \. d, Y
#BIC检验,贝叶斯信息准则,选择最小的' \- u3 ^8 p& ^
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
: K! ~* Z8 T9 h4 l
( s' |; V8 w4 K6 u' U#6
( Z$ G; X. |# m' j( y" y) \#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
. e1 t5 m6 H% I, y3 v6 T7 a#这三个模型预测的准确性大小,并进行解释。
7 a" j- v8 X$ Y# X m2 c# p: VAllmodel<-predict(lm.xy3,testData)
/ C' h: s4 I1 t. ~AICmodel<-predict(AIClm,testData)4 d- J7 y) S b3 v- `) W
BICmodel<-predict(BIClm,testData)- [3 k- W6 r! \
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差3 q1 E( S: o1 S2 W) y6 L j
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根& }' f% L+ }' N2 w, _6 N
#标准误差能够很好地反映出测量的精密度. }# n$ \9 b3 T1 P& m. v0 C0 W n
MSE <- function(x){0 @- F9 m3 l6 z7 g2 u+ e
mse <- sum((testData[,"salary"]-x)^2)/50: e( {6 Y/ w* w$ e
return(mse)) w9 {4 S. ~5 D0 M1 e
}
% A" f; `( C% s# \- ^7 D( DMSE(AICmodel) #AIC/BIC/ALL是误差最小的6 x+ k7 b" u9 ]7 l
MSE(BICmodel). k6 L2 E; [" r( }! { X- f
MSE(Allmodel)& w$ Z' M5 B7 J& s+ }0 h" r
' F6 ]. q! N8 q% a5 R5 e+ c! i3 Z; Z3 B& X6 S
2 s: u" _* ]: a
|
zan
|