- 在线时间
- 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 多元线性回归 一、背景
4 Q7 K9 X1 Y! L数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素- }# h) }8 A1 G, u7 [
#1
m' l' p" o) A. V" v- O- `+ U#展示数据集的结构% j/ ?+ t( ~' N+ i- e( ]; L: X
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
5 G7 X3 T6 b$ _+ |. ]6 Xstr(data2) #显示的结果有一列是多余的,需要删除
6 n$ \' y6 K! n; L1 l6 H- T# Gdata2 <- data2[,1:9]
0 z! {9 \/ ?* b7 U7 f; ostr(data2) #删完之后的显示效果是正常的没有多余列
$ r1 Y, P' ?4 M& e8 b. O, }# Z; c5 s* d9 s4 S" |) ^
#2
4 ]) j/ l8 w2 l) j' F- T#显示前10条数据记录
& Q' _! s$ Z% O9 Edata2[1:10,]2 g2 ~2 P5 L& ^) E( t" ]
' ^, h# P6 M7 A1 F* F
#3
+ P# o! O$ O$ L" N4 Q! K4 W( C' a; s#将变量名重新命名为英文变量名
8 \0 w4 i7 R% }* f; jcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends"), H- d5 Z: Q, T: u1 a: I7 L
colnames(data2) <- cnames! c' ?7 ^0 f( _4 b
View(data2)) j% G: B8 e- ?+ i
X2 R8 e' y$ B ?6 A6 m/ i
#4+ {0 R3 V/ Z% z! M% y4 ]( W3 C
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录0 S9 `3 l) O$ Y& f8 g
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
6 u* r+ b% j( b; e; B# F/ O#View(x2) #①先算出居住时间
4 X& o( W1 g l# i7 K9 Q4 L3 Z Mdata3 <- cbind(data2,x2)
$ m+ ?1 c3 ^* N- E, ?& K' o#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
1 y8 F# V# ?6 T+ nlist <- which(x2<=0)* C9 o, p4 T9 z9 @6 v& ?
data3 <- data3[-list,]
5 n5 R/ E" u5 @9 A9 S# [/ oView(data3) #删除异常数据后是125条数据
+ Z5 w+ Q% N$ Q8 j5 D' G& c! d2 A; Y" X* M( m8 l3 Z+ k
#57 I) ~! V- @/ j
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。* R% Z$ O2 R, g: U, B1 |
library(lubridate)' L/ N5 A+ y H2 Y% E7 n* g
date<-Sys.Date() #返回系统当前的时间
) Q# l, y1 J$ v" Q, n+ M, K/ Qnowyear<-year(date) #提取年份
/ U6 l" w" N/ [- O4 L" p: b: U- vnowmonth<-month(date) #提取月份( O5 O& ]' z3 o4 O8 n- Y
#View(date) #查看现在的日期* T! S% `1 k7 u) X* X- ^5 H
#View(month(date)) #查看现在日期中的月份% a6 T* \- b: P. T% u- f
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
* H1 ]( x8 a6 l" V0 ufor(i in c(1:nrow(data3)) ){0 Z4 [- l5 l \# C. k
if(nowmonth-data3[i,"birthmonth"]<0){
, Q) S! t+ M- p. i+ G# {6 K* M x1[i,1] <- nowyear-data3[i,"birthyear"]-1
5 K; o8 i- N' Z6 L+ N" Z }else{2 O9 ]+ P7 x6 I' X% K, D
x1[i,1] <- nowyear-data3[i,"birthyear"]
" q! j7 F4 O9 `2 G8 N, s" C }
7 H4 x5 f+ \' F! T5 v6 U}, V0 o( ]+ c3 \- o v. [1 t
#View(x1) #算出年龄x1,并加入到数据表中' V8 O8 |- j5 L9 W: ?) U' x1 A0 e
data4 <- cbind(data3,x1) 6 ~. ]4 X' u" G/ H
View(data4) #加入x1年龄变量的新表展示
! h. [9 B) z) [/ K0 t$ G' t) Wx2 <- data4$x2" D. Y( z" ]# a/ o5 l) T
Mean.x2 <- round(mean(x2),2)+ C) d" c) q ]3 |3 `8 X
Min.x2 <- round(min(x2),2)7 o1 e) Z8 q8 m7 X9 F0 S
Max.x2 <- round(max(x2),2)$ D# O& f. \: ^0 V8 m# R
Median.x2 <- round(median(x2),2)
( K) m- m) k9 M3 PSd.x2 <- round(sd(x2),2)5 Y+ G7 d" \$ K( P
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
* t4 N. O4 r/ l1 H: k. l$ ZMean.x1 <- round(mean(x1),2)$ k) K9 [. r5 ]" v7 X6 X% K% z2 \. B
Min.x1 <- round(min(x1),2)
* b$ |2 ?6 N* N' _ u- qMax.x1 <- round(max(x1),2)
* X7 b# z1 w" P& qMedian.x1 <- round(median(x1),2)
" s* q$ r0 G6 E" x3 OSd.x1 <- round(sd(x1),2), m! q' {. @9 U$ |& Y8 k
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果$ w5 b. K) p: t. n& y7 ]+ R) m4 z
x3 <- data4$friends
) A" R2 H a8 bMean.x3 <- round(mean(x3),2)
7 w/ x I/ H9 `3 j8 jMin.x3 <- round(min(x3),2)# k# R9 T4 h* v) U5 i8 l0 j
Max.x3 <- round(max(x3),2)
4 V8 p! t6 k8 I8 c$ N# B" OMedian.x3 <- round(median(x3),2)
; k& o) V! v$ [$ OSd.x3 <- round(sd(x3),2)
8 q; N; p) g1 U9 a& P; Hcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果 M, H: m! x$ }, J$ T+ D8 J' @
y <- data4$salary, T% C& _0 M3 _# z7 z5 O3 M
Mean.y <- round(mean(y),2)) g4 ]; ]) G& M' @0 Y
Min.y <- round(min(y),2)8 H7 [- U& @& {1 P% P
Max.y <- round(max(y),2)/ g+ K5 t; u2 w# _( |
Median.y <- round(median(y),2)
: @ e9 o. ~- a" XSd.y <- round(sd(y),2)4 t! V6 o9 g' u6 b. x. q9 `4 k+ O3 L
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果. v3 I2 e" l+ M! a( H
. Z9 q& S# Y- W) s5 F#6* a6 N Z- M# u, u. B6 f9 u j
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
( e( @, l1 p4 Z7 h, p1 ^9 ~round(cor(y,x1),2) #y和x1年龄; C8 Y# x6 k! g. a+ a6 w# _: L% t
round(cor(y,x2),2) #y和x2居住时间
, ^$ ]2 b8 Y( r( T' u( b9 {& Dround(cor(y,x3),2) #y和x3朋友数量
$ @; Z5 M8 Y, s; @8 B5 D; P3 C5 Y9 _) e9 i! @ N
#7; @# H c( w: U5 Z- \
#分别绘制数据集中因变量与各个自变量的散点图( i- l/ M: d0 m' `% S( C! W0 M* z
par(mfrow=c(1,3)) #布局,一行画3个图7 X* S7 }# O- C2 a) V0 {1 Z) _
plot(x1,y,xlab="年龄x1",ylab="工资y")
* J) C4 Y2 w1 I0 uplot(x2,y,xlab="居住时间x2",ylab="工资y")
f! Z d* {* {. ~0 h8 Tplot(x3,y,xlab="朋友数量x3",ylab="工资y")
6 E/ B/ n! ?- H: g1 J
# Q. C* y% _! M p#8
& ^- N6 s, ?6 k& X) ~#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。: n* b' B9 u* h. U! V& M
lm.xy <- lm(y~x1+x2+x3)
+ z8 \' F" c% vlm.xy5 L0 |1 Y3 ?9 j
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的7 ]2 R: f$ z' x4 b2 W
* U W+ C2 E. I/ b$ f9 l
#9
! l6 _' w( d1 q8 i#对#8中的多元线性回归模型进行诊断,确定异常值记录。0 T- f3 f6 X: P5 G9 K1 h7 y0 k* _
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列5 h9 A# L7 e2 v/ t$ z7 T' f
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
% _2 C& P4 b! Q) q0 l#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。" v7 [0 {4 \) J) q. a5 j
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。4 }0 |9 j. X1 t+ _: X$ Y
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
2 |( S! B% u1 T% q/ `; Pplot(lm)
$ w; a& k/ H! O3 O1 K. ]library(carData)* {; b. F, C' Z" S# M) d5 O3 U/ D1 S
library(car)5 m! d. i0 G% S' [: Q; L$ Z
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点5 w" j/ x W' G/ L, s% o- B2 {6 r
- S+ }) l B3 o7 b# T
#10; W1 _! `) U% {- A( ?( |" h
#删除异常值记录后重新利用多元线性回归模型拟合数据。( v1 Z; Z& d& d X" z8 k# ?5 h% F' u( \
data4 <- data4[-136,] #删除该点
. v: G- y; N( R* x) b8 cx1 <- data4$x1
$ u& `, K0 s6 C2 ex2 <- data4$x2
% m Q* w( V( b6 Y, ^/ nx3 <- data4$friends
6 y- r. b, a8 Q0 py <- data4$salary
; u8 F9 F1 G) i4 K& M$ Mlm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型: a% B: a8 |$ v6 t
lm.xy2
, L0 o: ~7 S4 a% e5 Y* R# Y" ?
9 [6 w0 G. \# ^#119 e: `+ g. p0 s3 V4 }/ v }- L
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。1 i+ _; i" y; J6 q. ^/ \* U% Z
vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)! G: r. n% d4 n3 g! M9 I
# K! G6 s9 H I; T% q. g#12' i; x: x# W1 U
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
! p0 h, _7 j9 qsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星2 [4 a/ Y S R% R+ M) k$ ~
$ W6 e `( S+ |3 S**********************************************************************
9 D9 K% |' G( ?3 C$ k4 `- X) d( _, ~: @" `: B- r) \
二、利用多元线性回归模型预测收入
2 B* T$ D* \6 T/ hView(data4) #124条数据' |2 S9 y" s6 }( h' G
#1
2 c% r1 s* c/ Y. k' M! s* ^$ `- H#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
% n- @9 b1 B. w; L; ~0 K4 y' u+ ntrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集% `- m4 q4 s1 K
trainData <- data4[train0,] #训练数据1 n, W+ |! P' x' @; L" c) x
testData <- data4[-train0,] #测试数据
: |( P* w8 S! I7 x. }' j. S3 U8 n. [8 X+ z
#2$ V7 s* a) ~4 R: v- V: J& K5 C9 g
#针对训练集,利用多元线性回归模型拟合数据。
, e( N% ^6 o- I' r8 S, r. dlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
4 x' \& r& Z& c0 b$ a3 w+ O0 l x/ Z# ^ ?: {
#36 e8 U) ]: U7 J9 b5 Q) o4 L! y4 J
#对(2)中的多元线性回归模型进行诊断,处理异常值。* A: F4 @. A- e/ O$ k! b* r/ p( T
summary(lm.xy3)0 v! g+ E# f+ t
par(mfrow=c(2,2))9 q, `' f( \: O" `' L
plot(lm.xy3)
) U7 ~1 {* a9 P! X* P3 aoutlierTest(lm.xy3)
; k9 Y5 d3 w" N: l8 N- mtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
8 Z* Y$ y0 @, v, E5 M2 M5 k( U# G
J; {* M; k9 `/ f2 t#4
/ w6 S3 L' K8 Q P9 d#对(3)中的多元线性模型进行多重共线性检验并加以处理。
6 f( H5 h C7 B7 @* ivif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
1 ?& g/ o4 [1 A8 }! \6 H) T2 Dsalary<-trainData[,"salary"] #引入的数据是训练集的数据
4 m; K. o) A! Q0 {x2<-trainData[,"x2"]
+ u+ b8 V4 b* m( ix1<-trainData[,"x1"]) {/ o9 \, D% v/ r
friends<-trainData[,"friends"]( f; L6 b4 R3 A: v U4 C: `
lm.xy3 <-lm(salary~x2+x1+friends)
( {7 z* w8 x# B Z. X! O; H& ?1 H; D i! o- X' ?
#5) F4 g. K+ _" z# R! Q
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。! ^) x$ ~, e7 H2 `
#AIC检验,赤池信息准则,选择最小的3 [0 d9 U7 B0 }% Z
AIClm<-step(lm.xy3,direction="both")
- Q8 u; z+ C _; H* }1 Y#BIC检验,贝叶斯信息准则,选择最小的2 Z: Z8 }" F; t3 ?, @$ I! l
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")$ b/ c5 C8 l* I
$ y1 }5 H8 n1 G#6- z; l2 X' [; h" Y. \' T
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型1 g2 `; X$ w! }! o! Q
#这三个模型预测的准确性大小,并进行解释。+ s' W* P% s; ]* ]4 u6 r8 E- g$ Q
Allmodel<-predict(lm.xy3,testData)
* u+ y; E6 R9 \4 X) K" KAICmodel<-predict(AIClm,testData)
4 p6 p; g8 m) ?3 s0 K# _6 V6 @BICmodel<-predict(BIClm,testData)/ q& \- E" P' m' [
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
$ C `# U5 R- t: C; m5 }3 Y#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根, j: x7 G0 N2 T! f1 F: I- [
#标准误差能够很好地反映出测量的精密度: p/ g, w$ E H! ]7 m
MSE <- function(x){% q% \/ ~0 k) l8 E+ i- ?
mse <- sum((testData[,"salary"]-x)^2)/50
' j* r7 Z' N0 l6 y0 t" W& C4 X return(mse)
3 ?1 |1 J& |* S}7 u4 V' k% Y g# |9 M
MSE(AICmodel) #AIC/BIC/ALL是误差最小的! r+ [/ I$ s4 e/ e! e. j
MSE(BICmodel)
6 p2 b" x q( nMSE(Allmodel)
2 a9 C$ D8 N. ^, |" C9 w* ]6 v1 D9 V" v: b ]7 H* _
; M8 [( d& k# I, X. Y$ H* ^( y9 T: ~: `! x2 a( y$ b
|
zan
|