- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40245 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12785
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景& S7 I( d) U8 x5 _% N
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素4 Z$ F- g8 O) i3 B4 c
#1
- a$ l( c# e* Q* l#展示数据集的结构0 g, Y' M6 B3 z$ x% J
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
6 d6 ^& Z& o4 L" mstr(data2) #显示的结果有一列是多余的,需要删除" @# B! Q+ B) U8 l# l |+ N
data2 <- data2[,1:9]$ x: k* f+ |2 h- \
str(data2) #删完之后的显示效果是正常的没有多余列6 o" Z7 I$ u& S- l, d: C' O
4 N' c# Y* L. b2 g#2
q( V6 [! V8 c- q: ^#显示前10条数据记录
# ~% G/ J# R3 |$ h* C# Ldata2[1:10,]
6 A# s+ A4 p4 W6 w6 I: Q' ?2 r7 S; f
#3
7 M$ O! C s# S3 _#将变量名重新命名为英文变量名
7 D$ Z( a* p& t7 g) C5 h- k8 Z6 hcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
( f7 j$ w1 b% ~0 ucolnames(data2) <- cnames- F h, q+ o7 ~& {% C* H/ C/ T5 _
View(data2)
3 ^. @. U1 J0 T$ m# ?6 L; H
8 {! h2 Q9 `; [6 W* w; ^#4& ~ M: r( X( q1 r- N$ j
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录* L8 s: Z: S( t* M
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))) i2 W. q4 }* D3 `8 o
#View(x2) #①先算出居住时间) }3 _" l4 `6 j" B
data3 <- cbind(data2,x2)) |7 c v* m8 v: k
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条$ n! C- T: M! P* M3 e
list <- which(x2<=0). p. l8 }5 b( f. [/ U- V
data3 <- data3[-list,]* N4 Z5 i% z- u6 x
View(data3) #删除异常数据后是125条数据
' E6 ]/ y7 x0 c7 B
/ R& ` j3 X% f#55 Q n" l7 i. c- _
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
" z' N5 k$ [5 f" {. clibrary(lubridate)
' z U( e1 C# s) r( wdate<-Sys.Date() #返回系统当前的时间. W+ n* @5 ^- w+ q* e
nowyear<-year(date) #提取年份/ f7 D& l% ?' U& J* M5 z& r
nowmonth<-month(date) #提取月份
) Z, ]* Q5 h" Z" [5 B8 H" @/ D#View(date) #查看现在的日期
" \( w6 T- K0 X$ r7 J$ Z#View(month(date)) #查看现在日期中的月份0 u6 U) \9 p1 V' p+ B# N
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1)) x3 r+ K: L( r5 a H: h- _9 {
for(i in c(1:nrow(data3)) ){
& \/ S1 o$ U. j1 I4 }8 @, i5 F if(nowmonth-data3[i,"birthmonth"]<0){
, Y' J0 \9 {) J% ]1 K! G# L8 c: ?( T/ ?! ]9 N x1[i,1] <- nowyear-data3[i,"birthyear"]-1
4 o+ n. V& f4 u2 K1 j6 Y }else{
- C0 m/ F* u; \" k6 F( n x1[i,1] <- nowyear-data3[i,"birthyear"]
0 X0 }0 u4 k8 X: d- \3 A }
# {" J P' j- H @}
- a3 D1 V! b5 Q5 r#View(x1) #算出年龄x1,并加入到数据表中. _$ X3 S+ F# s6 n/ M
data4 <- cbind(data3,x1)
; o% p& `; x" S! T" Q) o! dView(data4) #加入x1年龄变量的新表展示& j5 w5 S6 A, Y a3 H% n3 n) a
x2 <- data4$x2
: B, I, d; W: [; CMean.x2 <- round(mean(x2),2)0 _$ `/ F% T0 w9 G8 L5 i2 B
Min.x2 <- round(min(x2),2)- j( k+ U0 v7 C: y
Max.x2 <- round(max(x2),2)
- S% }" o. |, n* [) t S& KMedian.x2 <- round(median(x2),2)2 Z5 Y, l; K% I. o
Sd.x2 <- round(sd(x2),2)
3 K$ J& S5 c1 Ccbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
- e1 W, T+ B9 H% ?5 hMean.x1 <- round(mean(x1),2)7 a1 Z; b+ J2 K- H% G
Min.x1 <- round(min(x1),2)7 J, ^" p: f/ {5 R
Max.x1 <- round(max(x1),2)
* G0 O; o! n1 b. p, c' m' ?5 y. _Median.x1 <- round(median(x1),2)* @1 U; \* x' ~/ N+ C
Sd.x1 <- round(sd(x1),2)
% p: E W* k5 N3 d; Tcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
# M$ U8 ?# R& }) ]& L$ _x3 <- data4$friends
9 m6 V$ {+ t- d: Q; O: bMean.x3 <- round(mean(x3),2)
) V/ A" R0 w3 J7 ?Min.x3 <- round(min(x3),2)
3 a( I( N# @) jMax.x3 <- round(max(x3),2)* m6 T+ A# c' ^( }
Median.x3 <- round(median(x3),2)
% v% M7 p0 x8 L; ?. [Sd.x3 <- round(sd(x3),2)
- w& v [8 W# \: h# scbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
& O5 M5 C9 g7 `+ C6 W2 Yy <- data4$salary/ c. m% R2 y& N, b
Mean.y <- round(mean(y),2)
5 h. k0 Q/ G% o8 z" ~* GMin.y <- round(min(y),2)* _1 G$ I; i: e. z( G$ ?& L
Max.y <- round(max(y),2)1 m7 @9 o+ T# C. ?/ q7 g, J
Median.y <- round(median(y),2)9 v1 t, b- v. W9 c! R$ @. K
Sd.y <- round(sd(y),2)
3 C* z+ A& ~5 ]5 X Tcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
5 o/ y; ?. I* X( Y8 l* w: n/ ~1 S0 ^* n z/ |& S
#6. K7 P. F* K1 Q2 m' X
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。( o3 H9 I! r& M- D/ d
round(cor(y,x1),2) #y和x1年龄. l5 h# R' ]) d0 L
round(cor(y,x2),2) #y和x2居住时间
9 n, M) a8 r4 M/ Yround(cor(y,x3),2) #y和x3朋友数量
# q0 ]7 ] B9 X! B' {% Z- c' H$ ~: z: f2 R. y
#70 U1 t$ T9 l" H
#分别绘制数据集中因变量与各个自变量的散点图
3 ~( ~- S v D, ?, bpar(mfrow=c(1,3)) #布局,一行画3个图8 Z" c3 X- U5 `' }' Z
plot(x1,y,xlab="年龄x1",ylab="工资y")
1 D- V& F% a dplot(x2,y,xlab="居住时间x2",ylab="工资y")
. v3 m- q D7 a7 @plot(x3,y,xlab="朋友数量x3",ylab="工资y")
3 k' d+ F8 j: o( \6 I2 n/ J' ^+ Z( |6 K0 E& Y7 b1 N/ m
#88 v" M& H# O% \5 h, h$ ~
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
/ g3 S) n0 u" j c# Y, v3 llm.xy <- lm(y~x1+x2+x3)
/ f5 {6 a/ @% S3 g" |& I( D+ Klm.xy* `1 G+ n# f' x
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
8 U3 w, ~3 {# Z9 U( J$ ^$ r2 d3 W3 ?0 i# l# v! C# @1 \; I4 r
#9
" s" v' h9 U0 C$ r) i#对#8中的多元线性回归模型进行诊断,确定异常值记录。
. n. k* W3 P( B2 N3 T4 V! Mpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列4 T2 w F3 u8 P7 ^5 Y
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
0 Y% p' o6 y8 ] j$ g#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
- X, Z4 a# R$ U# o5 F: R) b#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。2 i# ?9 i9 T$ m K
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
! c& m4 w( N# I4 a! j) a/ iplot(lm)& s6 q6 E8 K% [ c, R6 m
library(carData)
2 H' d& H, g! q# v6 @library(car): O4 h7 u" J* t4 \
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
4 s9 i v7 _! h9 J( p4 C9 E& e4 M. H9 B5 \4 t; s' ?" A: o
#10# D5 Q" V2 p( \, c7 ]
#删除异常值记录后重新利用多元线性回归模型拟合数据。7 l& F2 x! N" w
data4 <- data4[-136,] #删除该点# u% N) c9 T% y# O
x1 <- data4$x17 x+ J1 K m6 U- l6 p
x2 <- data4$x2# x& v4 |# V6 v, `
x3 <- data4$friends' Y% J! [: j% Q$ j' M
y <- data4$salary
/ ]1 X+ ^' _; f5 G/ f% U$ j' ^- mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型$ W/ o" u8 v9 i( L
lm.xy26 y- D( U6 l/ {9 N. e+ H
! |9 J% N6 Y8 @. j! K
#11
0 f- e& U, O4 z0 Q8 V" i' \#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。& N; S% U0 F* G2 `. g* _
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)$ H: ]/ Y) A2 x. ~) w( W( F
: \. |1 U* ]& e# K* S
#12$ t8 M: i( N1 C6 f8 z1 V
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
$ J( F" a# l! |+ T0 a% ssummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星, W9 c$ e/ W& i
' J, ?' Y! \4 p+ H6 w**********************************************************************# r/ O& ?/ q9 r
8 S8 n- y' B6 w+ M) R0 n: [6 w二、利用多元线性回归模型预测收入" I) T: ^, C: _8 h% X. O# l3 u1 }
View(data4) #124条数据
9 h. J" i* J2 ]% g' u' A: W; h3 |#1! L2 f9 b7 E6 B- Z
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
M m) U, F/ D! @8 v6 C6 x+ E7 ntrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
9 G2 A& ^2 U5 X' T3 }9 ^) htrainData <- data4[train0,] #训练数据
7 [5 a. l1 J7 h M" G4 YtestData <- data4[-train0,] #测试数据
' Q/ |9 \1 Q! s! k
$ V( M4 E# r1 [, N#2
+ Z! p* H7 e! B#针对训练集,利用多元线性回归模型拟合数据。5 u7 J# Q; y1 v& P) o
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
7 m, }0 T% Y( M& W
3 D0 S. T/ W; ~! ^! k# w#3( c0 J9 j, g" D* x/ i
#对(2)中的多元线性回归模型进行诊断,处理异常值。$ `& X0 Z6 v, {0 j! t8 F
summary(lm.xy3)3 C q! q7 o# G7 @ o
par(mfrow=c(2,2))- N5 [* Y+ m* m, k8 x$ i
plot(lm.xy3)5 E9 Z9 G- t0 c
outlierTest(lm.xy3)
" c9 Y$ m1 r7 h! F2 u4 `trainData<-trainData[-c(150,32,82),] #删除异常值,随机的* I3 ?4 [( u! y* e; a
) P* Q" _/ E. |4 p$ s* S2 n
#4
1 w5 i- n4 A( e. U' w#对(3)中的多元线性模型进行多重共线性检验并加以处理。
. q" }3 i H4 |% N9 ]2 nvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在). O/ R: O8 w! A- N0 T5 z, E0 b3 h
salary<-trainData[,"salary"] #引入的数据是训练集的数据
; |6 t. ~1 E7 X/ C1 t3 `5 _x2<-trainData[,"x2"]
) L9 ?" m2 a Vx1<-trainData[,"x1"]5 N# Z" q4 f0 w$ d
friends<-trainData[,"friends"]- c2 Y" f* O( g9 J7 Q
lm.xy3 <-lm(salary~x2+x1+friends)6 y! L6 j* k) n# u& t" m& p- g
9 i) T$ O1 J( _5 M' t#5
/ C0 j7 P- I) r/ {7 s. x& H#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
! O8 g$ t5 b# r5 U( Q#AIC检验,赤池信息准则,选择最小的, @5 j. [- W. B- H# ~
AIClm<-step(lm.xy3,direction="both")
9 L1 k3 w' N# A#BIC检验,贝叶斯信息准则,选择最小的7 S! T; \6 ^* M) [% B' F
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both"). H" ?: N" A6 n8 k w) W$ v- j
+ F6 Q" G( S, y5 t+ K& R% ]1 H#6
& t) \, q/ d8 G, J3 X! y2 n#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型0 I+ Z- E) S5 ]5 l9 w
#这三个模型预测的准确性大小,并进行解释。
* k G$ x, k( T4 `0 x+ R0 J7 |+ i+ u/ NAllmodel<-predict(lm.xy3,testData)
/ j! h4 K9 P# k% P. |AICmodel<-predict(AIClm,testData)
. P$ N* E8 e8 R+ `0 z" eBICmodel<-predict(BIClm,testData)
1 l1 t F r( U3 H#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
8 z: _, s9 x' ]' j" ^#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
/ @( Q! B3 }$ \4 Z- Q% a#标准误差能够很好地反映出测量的精密度
; U; N: |% b" c0 p7 HMSE <- function(x){
J* f" w5 a2 N4 |5 [' m8 r mse <- sum((testData[,"salary"]-x)^2)/508 G9 f1 F$ i: J
return(mse)
" h5 ~- v+ N+ w}
( ^8 V! X, t3 ?4 D; ]" M" nMSE(AICmodel) #AIC/BIC/ALL是误差最小的; f% X$ k" H& [6 n$ t- D( i
MSE(BICmodel)& |! u& }, }1 k: z
MSE(Allmodel)# D8 L( W* {! F' _# c/ v
# _7 q4 P* \* }9 z+ }; d/ u7 \. V. h; P' }. [. Z
: t: Z. F9 M& x$ T5 ^" w2 ^; P
|
zan
|