- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40294 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景
$ U$ T, b. ], ]/ X/ g9 a" v数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
0 x( j+ n& m- g) U% u. `9 X#1
/ M) _; G" D0 ~ t) C8 Y( \#展示数据集的结构
1 I+ R! Y1 h' ^* o7 @# I+ V; w; Ydata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")" D; n3 m9 K* O6 w# d
str(data2) #显示的结果有一列是多余的,需要删除; a5 k- Q. T0 H* i% T8 }4 d) X! L
data2 <- data2[,1:9] h4 S1 V& y* q: L7 P4 `
str(data2) #删完之后的显示效果是正常的没有多余列
- j7 n9 d; I! f
$ `; k# z7 r4 t$ b4 O( W#2
( E& C% W4 P U* D#显示前10条数据记录
# B, r2 K, M( ~data2[1:10,]
8 _9 C( K3 k) [* N2 a
* o6 d9 L5 e& B! ]#3
% }; {- o( h' C: C1 G#将变量名重新命名为英文变量名0 K4 \: b9 T& S, P
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
" {) B. F L+ R4 o2 _# pcolnames(data2) <- cnames
1 Y# @7 e+ S$ w8 j- I& IView(data2)/ \" H+ B# n* {
) R# }7 N3 x- B( B$ W6 o
#4
7 Y! W7 i6 a7 |9 i y#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录- N( t! n7 Y) R# t5 Z
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))' N' A: \7 I6 u% d7 G" h& v
#View(x2) #①先算出居住时间& I8 \% M' W* F9 D4 `1 r0 b# ?: A
data3 <- cbind(data2,x2)
O6 u. F* v2 }, o. R! c- K) G0 X#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条* y( R9 j/ v3 ?8 o
list <- which(x2<=0)
; I7 k! Y( S9 g% t1 v& l: h2 Rdata3 <- data3[-list,]
0 S* T6 p3 D4 K. u, YView(data3) #删除异常数据后是125条数据
0 `6 s& l, p4 u- q+ ]
7 {! R* K: X; {7 S( H2 P# m#59 E' ~* e5 g* f/ u: s
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。: T% _% p! \% {5 p+ h7 C- h$ N# |
library(lubridate)# B4 Z" D R2 H7 H1 s% Q
date<-Sys.Date() #返回系统当前的时间4 Z, C6 p) i% Y+ Q# Q
nowyear<-year(date) #提取年份
# V0 n6 Z9 k/ S$ N! Pnowmonth<-month(date) #提取月份5 b- J. b. b7 p
#View(date) #查看现在的日期# z6 u' ]) j8 @8 H, T# @. u
#View(month(date)) #查看现在日期中的月份
2 s$ `6 U6 G3 ~ {x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))* |9 j A0 I2 k4 e) Q& m+ h
for(i in c(1:nrow(data3)) ){" ]; @% i4 x% X) P
if(nowmonth-data3[i,"birthmonth"]<0){
6 V( Y3 R3 t; J7 M- A5 [7 q x1[i,1] <- nowyear-data3[i,"birthyear"]-1
7 P2 \, U- I8 w$ { v }else{
6 q! Z9 b' C* b. N7 s% l x1[i,1] <- nowyear-data3[i,"birthyear"]
K& a- h, e4 n/ J$ j2 D, M }8 [; {( Z- j2 m+ t: W7 s
}/ i9 A5 G" V$ Y( o% p# f% s7 V
#View(x1) #算出年龄x1,并加入到数据表中7 `3 ^/ s2 M$ P8 U
data4 <- cbind(data3,x1) ; d4 t$ O/ k6 D# M
View(data4) #加入x1年龄变量的新表展示
/ U7 M+ c1 d0 R# Sx2 <- data4$x2# [0 o; F- p2 X3 |7 {- q \
Mean.x2 <- round(mean(x2),2)
. E8 C$ M) f# O$ P- D% ?Min.x2 <- round(min(x2),2)
& R" J" N6 w, ? G0 NMax.x2 <- round(max(x2),2)
9 G# L. R+ _% |1 u. L8 uMedian.x2 <- round(median(x2),2)6 B- v+ G" A" [
Sd.x2 <- round(sd(x2),2)
# {, O+ O8 b; E: k6 S. B1 g) Fcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
# q" ^% @/ ~" m. R' uMean.x1 <- round(mean(x1),2)" ^! M& N) N8 a, m1 L6 d
Min.x1 <- round(min(x1),2)
/ o) C4 _' t. DMax.x1 <- round(max(x1),2)( u( G/ U% n0 S) U+ z( x1 C
Median.x1 <- round(median(x1),2)
" J# f7 f& \1 L7 o$ O7 O$ tSd.x1 <- round(sd(x1),2)
- c2 O& _3 A. C6 ncbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果8 A- b m; \8 U, A4 ~& r+ ^+ p
x3 <- data4$friends& ^. B0 j O& ^6 H( Z! w: I' A- @
Mean.x3 <- round(mean(x3),2)' s/ k1 ]) m( I3 V7 c* }
Min.x3 <- round(min(x3),2)3 C% G( R% t. @- E" h7 w
Max.x3 <- round(max(x3),2)& D, ?8 S; }: L4 e. H& c- J
Median.x3 <- round(median(x3),2)% [; o6 G4 N% H' r. i4 B
Sd.x3 <- round(sd(x3),2)
* d/ S; A5 i2 H* ^! d2 D- v% vcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
3 q7 u, G6 x; @2 E3 `5 @# v$ n6 Ky <- data4$salary
8 _4 i1 y Q! Q6 D8 a E$ JMean.y <- round(mean(y),2)2 L/ b4 y: _* q. ~
Min.y <- round(min(y),2)
" G, K9 ^ I+ d1 Z# w3 \Max.y <- round(max(y),2)
" g* z r+ N% y+ s# [Median.y <- round(median(y),2) v* A7 u: A2 |/ z: B: q
Sd.y <- round(sd(y),2)) l4 k2 m# B: d. I* \ E
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果. U1 Q7 S: @4 M$ X2 c% V2 |
, S1 a4 c% F8 ^" r$ R& L
#6
- Q. Q4 \/ }: x7 h* \9 s#计算数据集中因变量和自变量的相关系数,要求保留2位小数。7 @ W5 {: C1 k* d
round(cor(y,x1),2) #y和x1年龄5 Z4 s" |9 q% F) L
round(cor(y,x2),2) #y和x2居住时间7 i6 u& i2 z' j5 E5 `
round(cor(y,x3),2) #y和x3朋友数量
# N- ~* d4 q, ] d
3 r6 a/ D3 C8 Z: N# j& D, ]#7
n4 j g9 q2 `2 X0 D# L& G#分别绘制数据集中因变量与各个自变量的散点图. Q3 z2 G3 b# a u
par(mfrow=c(1,3)) #布局,一行画3个图
" L2 K A5 O* d4 \6 gplot(x1,y,xlab="年龄x1",ylab="工资y")9 ?9 ?' k. c! p: Y) P% j, L' v( v
plot(x2,y,xlab="居住时间x2",ylab="工资y") ~$ @4 J1 X! ?% _( ]
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
0 U: n" F% ?* j: b. t8 d8 A8 o: K+ i7 @; Q$ H8 U! N9 m6 F) g( S& z8 B* V. }3 z
#8
7 C5 ?9 g* ^0 L! n' v- n#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
' |8 C7 D* x! q+ _( qlm.xy <- lm(y~x1+x2+x3)
2 u- c" n, @, @* @: m4 j1 ?1 llm.xy7 _2 H* y* o2 z% H" B
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
+ C. ~' S" a$ d$ j) |9 S# i, u6 Q! g. Z1 e+ u
#9
3 b- o5 k/ E" P5 [* `#对#8中的多元线性回归模型进行诊断,确定异常值记录。. S6 v" k4 p1 {0 C
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列! `( I8 R' Z2 Q) Y' Q
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
' I" N4 g0 ]' h#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。. D# o8 |& A0 q" X
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
8 E G1 _- e3 ?4 l" l#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
7 S' O7 Q/ t4 q% @! Splot(lm)% R5 q7 g5 A. l
library(carData)
0 s* J e& I0 ^8 X! M! Zlibrary(car)
# G& \' m6 W: z- q' coutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
0 b! ~* E/ S! ]8 T2 h4 W7 a
: C3 S$ d% q5 J# p, G#10
( {# v) t( ]- B- O% K! U#删除异常值记录后重新利用多元线性回归模型拟合数据。
1 ]7 s5 i: s# l+ ?$ X5 r. Edata4 <- data4[-136,] #删除该点
- u9 a! z% X' j6 P L Ox1 <- data4$x1: X i0 m5 i. \, ]* N W9 ?! I
x2 <- data4$x2# H# M& O/ Z$ [, O
x3 <- data4$friends/ G/ h& a8 {: `! {- e4 F
y <- data4$salary2 v' K- v# M% ]/ g& q, y7 r
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型' z& m2 t: v+ e
lm.xy2/ V E$ o2 J0 t6 v5 R% H8 J. j
6 X2 U0 u8 h* }( ?& V#11
3 T- ~5 k5 r# B, t4 L4 g {#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
f; E: b! Z" d( u: x; hvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
# S+ L2 R6 n9 _
2 y( o" y* s1 |) r#12! N T; w: R! ~. }0 j) m
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。& v3 r0 ?+ v- E) u$ x
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
. p# J$ }+ P9 V r( C3 L! v5 O' y ^, z0 P3 X% V: o# _0 B
**********************************************************************5 B5 h; x2 J" _5 N+ R
! M+ j: b, D1 J& S2 r2 N" Z
二、利用多元线性回归模型预测收入
' f& _5 d& l- i. S" v9 M2 FView(data4) #124条数据
P" N: F, v" }" M7 n9 N#1% b6 Y3 a& h$ P1 P) l" r
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
5 d1 W$ k# b2 }& T6 S, n6 @train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集3 j- Y! J7 A7 U1 @! B2 L+ i
trainData <- data4[train0,] #训练数据! c. d9 s6 u/ K9 P0 J
testData <- data4[-train0,] #测试数据
3 u/ d' `# N8 b$ C+ `5 b
- A6 z4 z. a8 t) I. m#26 a1 g; w6 ~# g& b+ d* d' S( O
#针对训练集,利用多元线性回归模型拟合数据。
4 m, v8 I$ A ^' D) c; h5 q4 Vlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])7 W* G+ y& u" z' h
1 @" f1 [. k) N- e. m0 q! p( ~
#3
6 h2 z1 F' B' ?, m+ ?- f#对(2)中的多元线性回归模型进行诊断,处理异常值。, Y2 X. e* T+ p
summary(lm.xy3)
- W% n! z# V1 {5 s5 |# \par(mfrow=c(2,2))) f2 \: f6 S9 }% d3 U8 V
plot(lm.xy3)/ {9 q1 l: c3 q% C! \ l7 Q) ?. Y
outlierTest(lm.xy3)
- _/ E+ _, n* H ztrainData<-trainData[-c(150,32,82),] #删除异常值,随机的" j8 f1 G0 {: G4 E4 u$ O* {; O
- q3 o0 g9 G( B#4
# o" R% S0 t' ]! a9 P' L! l5 ?#对(3)中的多元线性模型进行多重共线性检验并加以处理。; |0 n+ m i3 J$ Y
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在); S- C7 U& S7 G( n, K& |& E& Y$ A
salary<-trainData[,"salary"] #引入的数据是训练集的数据: ? M: d% R) ~9 [, w
x2<-trainData[,"x2"]
" Y$ c; \% I9 m5 mx1<-trainData[,"x1"]
" c( f2 V8 b" Y( ^% ~6 r! S) afriends<-trainData[,"friends"]
/ _$ T4 j& t' y& S8 O! Qlm.xy3 <-lm(salary~x2+x1+friends)
- h" f$ S0 W6 l' R, {3 N3 S9 j. t6 V8 `; q. _
#5& X* F9 ]! _, f+ w# @
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
9 p1 e4 q0 \/ G; _0 G#AIC检验,赤池信息准则,选择最小的
! D% k9 K& W/ V5 [; iAIClm<-step(lm.xy3,direction="both")' g# ?1 v4 v, `8 U4 L, ?' Q
#BIC检验,贝叶斯信息准则,选择最小的( k! V0 M1 C. y1 h
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
6 V( ]! _+ [/ Y" @; M0 e, M. Q0 K6 g5 V$ i( o) n* s- _* [
#6
% u: A$ d+ M& s/ }#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
% I# R0 D! U z#这三个模型预测的准确性大小,并进行解释。
9 G* X/ m9 t, O7 M1 _1 UAllmodel<-predict(lm.xy3,testData)* `6 I( A- c& N4 ?0 Y7 B' o
AICmodel<-predict(AIClm,testData)6 n$ y% Q- r9 r4 W' L6 D0 `% ?7 s5 X
BICmodel<-predict(BIClm,testData)
% \: l5 O2 ?% Y% z4 @. f5 n#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差& o" B9 y" `9 d5 A- h
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
& t5 H- D, Y ^9 Z#标准误差能够很好地反映出测量的精密度
" `7 C8 M. y; f) t4 nMSE <- function(x){5 \2 \8 _' E7 y$ M$ Y; N/ ^
mse <- sum((testData[,"salary"]-x)^2)/50
, s+ R4 g, t$ H return(mse): c; Y: a& J4 f# p5 r
}
k& D9 R B* mMSE(AICmodel) #AIC/BIC/ALL是误差最小的
2 x1 [# `- N0 y( c/ h$ r1 u5 R# AMSE(BICmodel)( C2 M7 q0 [, j3 a) J1 J
MSE(Allmodel), b( k* @ Z' ^3 M
8 o6 N) | S6 Z1 I% Z
0 G a9 [; o; c) D3 ]4 W' A
3 |4 C" x: c9 b% M; ?0 G Y |
zan
|