- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40214 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12775
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景7 e% K& g. F T# U7 H: e* B
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
4 E* h) g3 I- s6 T6 P8 F/ _#1
( @/ f+ \/ C/ A( W' _; J1 n: s#展示数据集的结构
+ K+ D/ B7 ^) t @, h1 Rdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
' z# \; U8 O8 s* B) E: p( y! hstr(data2) #显示的结果有一列是多余的,需要删除
7 _: z3 ?9 g$ ~! Z" E4 Xdata2 <- data2[,1:9]& f9 [' w& {$ E: p; v
str(data2) #删完之后的显示效果是正常的没有多余列3 U) Z" e5 A( \. k" Z' X1 G
$ T1 g3 b* a* s0 H! ^ V#2
! N) B, q! q' k7 D! [#显示前10条数据记录
g x. g" f v, U# L0 Hdata2[1:10,]) p! ]. |' h' l7 o2 M( l
- L% U0 L8 J- y1 H! H#3
6 o3 \( P" o- j3 u#将变量名重新命名为英文变量名. K1 Q% e# Z& T2 }; `7 Y' s
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")* K ]$ X( C. W
colnames(data2) <- cnames0 a; ?$ r" F- p2 G! E" E; d# t/ S
View(data2)
$ l: E+ Q% T$ Q( E; y, n. I8 a+ a/ q" r- G/ h9 {# _& N
#4
2 N# E7 P4 s6 {5 I. @. L! u#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
7 u% m( k0 G) m4 ?; Sx2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
5 a- B6 g' ?# S: Z2 U! u8 m% z#View(x2) #①先算出居住时间7 d- s+ e% Y, m" O
data3 <- cbind(data2,x2)
9 n' U! I: f" I3 m. g#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
& B2 u% N. ]& A% D2 Qlist <- which(x2<=0)3 O0 h6 F; @7 c9 F0 N8 l
data3 <- data3[-list,]
) p" q2 H' a1 U# @' m8 fView(data3) #删除异常数据后是125条数据
( @9 o/ ^2 p2 c" H( J6 v( Q, u' E1 t9 x/ ?; ]
#5
& Z/ H7 h8 ?( D, q1 w#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
9 T+ K6 l- M$ D$ O3 [library(lubridate)
* k" E2 I6 m$ b! E9 n- C: L- qdate<-Sys.Date() #返回系统当前的时间( D4 ^& G+ E3 b
nowyear<-year(date) #提取年份5 a9 c* u5 e+ Z1 ^0 N( a
nowmonth<-month(date) #提取月份/ `" O0 ]$ u8 Z) a
#View(date) #查看现在的日期# u1 _( m* _9 \8 \& E+ e
#View(month(date)) #查看现在日期中的月份
6 }( a1 u( e, o6 W% D6 Ux1 <- array(1:nrow(data3),dim=c(nrow(data3),1)): u( P3 e5 U+ I; }3 A
for(i in c(1:nrow(data3)) ){$ [+ t1 T5 c) ^0 o7 D& l5 M
if(nowmonth-data3[i,"birthmonth"]<0){
9 @6 ?; ^. A: w& B* ^1 V q: O x1[i,1] <- nowyear-data3[i,"birthyear"]-1: N) w" Y3 ]# Y5 A
}else{8 S) s( b5 L% s/ ]: `3 L" s' q O1 V
x1[i,1] <- nowyear-data3[i,"birthyear"]
, W0 t! b- E9 A/ q3 a8 N! l }
, j @/ r$ c. V- e% m4 ]}
( T9 y% H1 r1 N& G& }#View(x1) #算出年龄x1,并加入到数据表中
; H6 o$ b2 F! k- e1 x5 V5 C0 hdata4 <- cbind(data3,x1)
3 \5 h# W8 S$ tView(data4) #加入x1年龄变量的新表展示+ L' ?5 `* S0 x+ u0 V
x2 <- data4$x2' Q/ H5 w. o/ h8 m+ R/ e- S
Mean.x2 <- round(mean(x2),2)
1 d- v* z1 E7 |6 V3 g: D0 `! N0 XMin.x2 <- round(min(x2),2)
7 V0 J, a2 {) k3 G1 Q# F6 g L( cMax.x2 <- round(max(x2),2)8 V+ m/ `/ {7 Z) L9 z) S
Median.x2 <- round(median(x2),2)& x+ u3 z; h+ X5 P9 M6 a
Sd.x2 <- round(sd(x2),2): @3 T+ e8 k# Q% x
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
( {+ F" e! C) K/ f( m6 Y; ZMean.x1 <- round(mean(x1),2)& ?! \; D: f+ a9 F. `! m0 i
Min.x1 <- round(min(x1),2)
3 u% u4 }9 U* f3 i z$ |Max.x1 <- round(max(x1),2)1 |8 I2 V% a5 @, }' V7 D. W) z+ w
Median.x1 <- round(median(x1),2)9 w5 B+ e1 |3 o& Z/ V
Sd.x1 <- round(sd(x1),2)
/ p! a% _. O6 F4 k4 }1 P6 |cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
& f, @8 q- ?/ ?: ?x3 <- data4$friends' g8 w& b# B' \5 n
Mean.x3 <- round(mean(x3),2)
& i, x/ d4 ^. e: ~# FMin.x3 <- round(min(x3),2)
0 l @% ?7 D0 Q" U$ |Max.x3 <- round(max(x3),2)! a3 V( A; Z" P- M8 t
Median.x3 <- round(median(x3),2)0 H9 f* K2 ~3 b8 d) [7 G
Sd.x3 <- round(sd(x3),2); s! H4 l4 Q* Z8 f* ]% l
cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果4 J1 [1 @% \& O' Q: e/ g. S6 L
y <- data4$salary/ O+ J, o, I3 R/ z
Mean.y <- round(mean(y),2)- ^" q* O1 r* M: k k6 X
Min.y <- round(min(y),2)2 P! o* c7 H# P- t6 z6 c
Max.y <- round(max(y),2); D3 b* J, T7 d9 m8 a+ U0 |
Median.y <- round(median(y),2); H. v# J: Q/ o0 \. I- A3 B
Sd.y <- round(sd(y),2)9 D' S% v, Y+ b [
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果% g2 a1 f6 i3 I, R
- D, H2 f" N8 G+ R7 {1 U: s% P#64 h; S/ {4 g, R7 p
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
$ Z3 P# E6 y4 _round(cor(y,x1),2) #y和x1年龄5 w) g3 U7 S9 Z" G
round(cor(y,x2),2) #y和x2居住时间
- E. n# F, K& i7 K8 Fround(cor(y,x3),2) #y和x3朋友数量
j/ ?2 v3 E( w- T% T) U2 o: Y6 x4 R# R P! w2 ?
#7
9 y! j6 e( S; @& E; |5 O6 x/ j9 G#分别绘制数据集中因变量与各个自变量的散点图
6 c, S; G7 c3 A& t. F* O( Ppar(mfrow=c(1,3)) #布局,一行画3个图' s! U% N8 H8 Y1 T% f& n
plot(x1,y,xlab="年龄x1",ylab="工资y")
0 _/ Q; f8 W. Y1 H" w" \plot(x2,y,xlab="居住时间x2",ylab="工资y")% t) a) T/ v6 T1 @, Z1 [2 u* w
plot(x3,y,xlab="朋友数量x3",ylab="工资y")9 G0 g) X, T$ u8 f0 l/ j
) e4 _% j, n0 _! x
#8' f$ y; L. B4 E* _5 ^
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。. Y7 s5 o. B; n* b- H( R8 U
lm.xy <- lm(y~x1+x2+x3)# H7 U3 H2 H8 [1 \( @
lm.xy* H. s9 Z3 g" G( d
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的% Z7 H- M5 {: x$ n. t1 |+ S" i# T* J
$ N: M" h3 `/ |0 l#9
% I- l- o! R' t- I0 E4 j& g) i+ K#对#8中的多元线性回归模型进行诊断,确定异常值记录。
# {( L; O+ s/ N- O3 V% fpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
# q4 c6 ^$ ~( q2 i& T6 d#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布5 Z" U0 C4 x1 r% s3 i* z
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
* n; a0 c( g+ p- u% d" I#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
; U, u7 B" g- Z9 E1 m) M#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
! u3 V- ]+ }8 B) w8 y% d7 E2 E3 kplot(lm)- f1 {) S' Y, b& T; F) k7 t+ h
library(carData)% B# z5 D! z1 C v
library(car)
- Q4 o( c, @3 c% r4 S8 VoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
; @5 j) V9 b, M* z( u
# E$ M% ? n1 ~- K: l0 h5 K( |+ P( f#10
; K/ F( S! k' C2 x) G#删除异常值记录后重新利用多元线性回归模型拟合数据。9 z2 A1 _% y" \" H: k% [# C" J
data4 <- data4[-136,] #删除该点
- S1 q) s! @) [x1 <- data4$x19 X3 F, L% w" G
x2 <- data4$x2
+ d, C3 e- m6 x2 @0 H5 _x3 <- data4$friends2 G$ d$ i! J' b) C, D* o8 Z) M3 r. o
y <- data4$salary
8 r) D9 @: F7 ~/ {/ _, L0 Klm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型* O3 {$ u9 c8 v
lm.xy2
s0 { ^# |- X0 t
( m, f: O. e# F5 r7 M+ z8 q0 B#11
3 j% {: U3 X) j6 m' q5 E6 P! k#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。5 L- W7 Y! O6 r( F# X' }
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
# X5 ?! O/ d) o& W) A9 w& o
6 ^8 N8 _! B" R) @9 K#12* S. h0 [; ]7 i) M
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。* f$ h$ R7 l4 S& h7 U- c
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星3 S) ]" h5 N: p" w) n6 {6 W
1 K5 X5 I! R, b& _
**********************************************************************
/ `& `! H. ]* ]0 B& e
/ o6 e0 q. Q. V) q. z* U二、利用多元线性回归模型预测收入* a: ]2 D- i' X9 I3 d- w/ Y$ a! D
View(data4) #124条数据# w) @. Q- ], X* `# H8 m
#1
6 |0 g" ]1 @2 l& y#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
0 u1 M7 J0 _7 |train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集6 K- C/ T: z ] Q4 y& f
trainData <- data4[train0,] #训练数据: v: O" }( C* a
testData <- data4[-train0,] #测试数据
+ N/ v4 i9 m- |# |- A% v$ ]" U' U! }2 Y' P$ S( U6 t
#2) _( S' p7 j! V
#针对训练集,利用多元线性回归模型拟合数据。
A, ^. h9 D* U+ u) ]; y# N5 ilm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
0 \" U& o6 z6 B
- E1 X" T, R( }#3
* U* O8 i9 O" i& ]" o#对(2)中的多元线性回归模型进行诊断,处理异常值。
/ G# ]! Z! t! t/ Xsummary(lm.xy3). f) u) L( f% Q: W& ^
par(mfrow=c(2,2))% h& x% {1 x S4 T- ` P
plot(lm.xy3)0 f' g! I) x( ^/ f2 l# n# Q+ ?
outlierTest(lm.xy3)- B' Q% E8 S" \, T- `
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
, U* y, g) |% r1 m
6 M' d7 `3 U$ m#4
. c( O' z6 \) }#对(3)中的多元线性模型进行多重共线性检验并加以处理。
. U' w3 q9 u' x# @7 r8 ]2 R* ~vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)2 l1 [! j& O& _
salary<-trainData[,"salary"] #引入的数据是训练集的数据
8 H1 X6 }* o# B8 Q) ^2 b; N6 ]x2<-trainData[,"x2"]
! x% C) ?2 S# ~/ q% g, sx1<-trainData[,"x1"]
& |% T2 E+ o! b) cfriends<-trainData[,"friends"]$ z) Z- h% B, f0 y* d
lm.xy3 <-lm(salary~x2+x1+friends)( W- e/ b: Q8 @$ k, z
; n/ T0 _ J" h9 p3 b& G" [
#5' |: ]3 w4 p! h
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
( X1 \4 _; @5 f6 J" A0 s- S6 a#AIC检验,赤池信息准则,选择最小的. h) g2 ]7 E, |! T
AIClm<-step(lm.xy3,direction="both")
: }$ p/ D) [* L( U#BIC检验,贝叶斯信息准则,选择最小的 d- h3 c# z) [7 R& m
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
, h' G8 ~/ y! O0 o3 h r5 U
. a, \0 U. x$ c# ^! k" J0 f#6$ B0 s0 s+ L4 N5 v
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
5 z) \7 c1 M# Y, D#这三个模型预测的准确性大小,并进行解释。
) n' g# q7 }% A, mAllmodel<-predict(lm.xy3,testData)
3 U0 v" w) H( Y7 hAICmodel<-predict(AIClm,testData)
6 V& G* M# ?) E3 R1 X3 H6 X/ dBICmodel<-predict(BIClm,testData)
* Y/ D9 c2 ?" e- }! k/ ?$ l$ T#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
7 K/ x' q. @7 V3 Z#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根; z! ]" P, A/ `0 G+ B% C3 `% F
#标准误差能够很好地反映出测量的精密度. K4 G+ ~$ d1 k
MSE <- function(x){' S3 E5 x4 F4 S7 U# T6 g
mse <- sum((testData[,"salary"]-x)^2)/50
6 s1 j6 P4 T5 {$ Y) B+ D: m return(mse)
5 G% x5 s7 r5 Z- b}
' U0 V. ^5 Q g6 [MSE(AICmodel) #AIC/BIC/ALL是误差最小的
7 C: u/ I L1 [. }MSE(BICmodel)$ W8 {9 b% X! i: W3 L3 A! ~
MSE(Allmodel)
" m( p& u1 F$ `7 J; j J5 j7 i8 b% t8 D( }5 }% {, G
& u9 u# S( ~: H& W+ o7 N9 {3 e7 T' k; e+ e6 r4 B/ w
|
zan
|