- 在线时间
- 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 多元线性回归 一、背景! z. ]% d2 L7 ?, ^
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
% F( R3 W; A: n; k#1
% f8 S9 t* [1 W( H9 f% O$ ~#展示数据集的结构
+ @- G- \& i; Q3 z+ ]" _3 Vdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")' G) i Q) S! e( `. o- o
str(data2) #显示的结果有一列是多余的,需要删除
3 u2 _3 A. @" _. Ldata2 <- data2[,1:9]: T6 ~) U3 P5 }7 U
str(data2) #删完之后的显示效果是正常的没有多余列
4 \ }; ~2 R$ \! [2 }/ X6 l
! ~* w+ d$ I& x$ }" s" p#2* i+ n9 @6 @: ?
#显示前10条数据记录
7 f: i. s) L; ndata2[1:10,]
7 z7 e" f2 e9 K( u0 m! z `& b+ ~/ X: b& Q
#36 `* r& c5 j( L2 p0 E" `: y1 o
#将变量名重新命名为英文变量名0 n- x2 {5 V# @3 l' f& ^: x+ w
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
4 j; C% Y9 ]" Icolnames(data2) <- cnames
# M* _4 P( E' \: |, F/ S$ tView(data2)
/ k' N: J% E8 a8 W1 H, U/ V, W' `' z O
#4
- \3 [! q9 P6 i N8 _#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录; U9 z( k* l7 m1 v2 q% [# [% j# |
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
$ J2 q" y! I: G4 T# n& P& l8 Y! R3 A/ n#View(x2) #①先算出居住时间7 s, S& q8 d5 D& \/ n5 ]
data3 <- cbind(data2,x2)5 v# S9 ?2 o; V! a1 [! @' w
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
, l9 s. e# A" Alist <- which(x2<=0)% v. F/ ?% \. O/ F7 a, ?3 l
data3 <- data3[-list,]
% O9 c3 g$ i+ }( r7 ]7 M+ GView(data3) #删除异常数据后是125条数据6 J4 T0 V, f) Z) L _5 e
, Q0 Q2 C. ~3 t; r7 N, ]( B
#5! G' S& U2 f k# v* f
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
+ ^* ?2 F1 O, M+ zlibrary(lubridate)' `' @: H$ R2 w8 n, F" B
date<-Sys.Date() #返回系统当前的时间 _4 z8 K8 t ^ |
nowyear<-year(date) #提取年份2 Q6 X1 L$ U ?; d
nowmonth<-month(date) #提取月份
( |8 n ?( J8 Q7 B2 ?% F#View(date) #查看现在的日期
' w0 M* G# ?* E7 u ~0 V#View(month(date)) #查看现在日期中的月份
; R3 d6 S8 _- o+ W3 `x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
9 C0 J" s' \) Q7 S8 w! {- qfor(i in c(1:nrow(data3)) ){+ m e" K4 z% B. ]# i
if(nowmonth-data3[i,"birthmonth"]<0){
8 Z! Z% [) S3 b5 c1 ^ x1[i,1] <- nowyear-data3[i,"birthyear"]-1
2 _( @0 q6 T% O9 ~0 z+ c: R }else{. }5 ^7 @4 H- Q; Q @" E( ?
x1[i,1] <- nowyear-data3[i,"birthyear"]
1 A a& X/ s6 A ?4 J: U$ u }
5 V! D5 J) B$ L8 I9 p% z}
6 c, a7 G( Q- {, \$ {4 z( {#View(x1) #算出年龄x1,并加入到数据表中/ c7 R5 p; {! i+ |% U7 _& H
data4 <- cbind(data3,x1)
9 ]2 F5 }# o }2 U; R6 I; T! }View(data4) #加入x1年龄变量的新表展示6 Y+ ?1 ?; S9 Z5 X0 k9 ?/ ]
x2 <- data4$x2
" Z4 K4 G4 h1 T( M$ y. J+ t& DMean.x2 <- round(mean(x2),2)3 o. O/ `) D( q; g; d1 h" d
Min.x2 <- round(min(x2),2)% b+ d0 \, M; ` z' k% Y% N
Max.x2 <- round(max(x2),2)( ^! d6 b [, j, c
Median.x2 <- round(median(x2),2)
* | m* a8 ?5 |9 @Sd.x2 <- round(sd(x2),2) s, f/ N) P a I4 [7 b
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
- @- s. C4 Y" r6 T" XMean.x1 <- round(mean(x1),2)
" |( T7 Q# k! Z+ ~8 iMin.x1 <- round(min(x1),2)
) d f8 b& u; j: d, J! T3 m5 B4 AMax.x1 <- round(max(x1),2); i7 l: s' ~- o
Median.x1 <- round(median(x1),2)
7 Y6 X' p' t8 sSd.x1 <- round(sd(x1),2)
1 Z2 t' E+ Y, S% X' W$ `4 F3 Ocbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果 u6 y6 \: [. A Z' L
x3 <- data4$friends
$ h( e; R' p8 t% j9 _$ V2 KMean.x3 <- round(mean(x3),2)# F7 l0 l1 C) t: m- m% ~, E
Min.x3 <- round(min(x3),2)
( M, Y; u% J0 y$ p6 uMax.x3 <- round(max(x3),2), t, \" R' i& _# g7 J) U
Median.x3 <- round(median(x3),2)
3 f) L* Z& o4 w4 V) sSd.x3 <- round(sd(x3),2)
% w. L$ Z& Q$ @/ T3 o6 x7 Rcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果
/ Z& E( v! l' j! `$ W$ T/ my <- data4$salary" A: F1 L6 t1 B" M
Mean.y <- round(mean(y),2)
2 L, s4 D- u @. c# u1 a& m% PMin.y <- round(min(y),2)* t. W. P: c. ^6 F1 }% F- n% ?
Max.y <- round(max(y),2)9 x1 d2 W: E6 H
Median.y <- round(median(y),2)$ u% |9 q9 B9 E. z* O5 C! H
Sd.y <- round(sd(y),2)
% S9 N. n5 \$ [# o( w- Hcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
' ~% N' G" Q# ^6 ]( G3 d1 c
2 N0 T( M7 r" P4 }8 ~% z2 n8 j#6
) I# T# e: w- E8 L. x#计算数据集中因变量和自变量的相关系数,要求保留2位小数。6 x: t; q) Q6 c
round(cor(y,x1),2) #y和x1年龄
: A( w& e6 s9 o# V) ?/ L% y! Yround(cor(y,x2),2) #y和x2居住时间
, K* Z; `, Q5 U+ ?% T- B) n: oround(cor(y,x3),2) #y和x3朋友数量7 v. X* t" D* u: o- T
, I1 ~5 s& m T) r' E+ F8 d% P! P
#7
" e: S. [+ |. U- ^. x#分别绘制数据集中因变量与各个自变量的散点图$ b9 I7 i [2 M0 ?8 Z/ n
par(mfrow=c(1,3)) #布局,一行画3个图0 C* E- W4 K1 m/ b: g2 l d
plot(x1,y,xlab="年龄x1",ylab="工资y")
1 Q' w. }4 Q5 y2 Mplot(x2,y,xlab="居住时间x2",ylab="工资y")
1 a, w6 h4 d6 c( B: y9 h. Rplot(x3,y,xlab="朋友数量x3",ylab="工资y")
3 ]+ r" i9 h7 ]# Z% r4 m! u0 R) ]2 Z$ o6 g0 D* v" j) r) B
#80 g- e( s" L$ {
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
0 [* ?. i* q5 I- Klm.xy <- lm(y~x1+x2+x3)6 E7 k0 m3 |* g
lm.xy( z$ f* `# r; x3 S/ z. J. h$ M
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的( l) Y; e1 ~' c/ m
# @, m# k& K) C#9+ d4 G& ]3 ~% C+ @8 |9 W6 y
#对#8中的多元线性回归模型进行诊断,确定异常值记录。* U; J5 c: T+ J$ D. O- J; {+ f
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列# m) e2 ]/ M( X" O3 W
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
, x% m$ y) ]# N. z9 p1 e, `. _#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
2 a: J s+ I! a#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
6 U0 d' f% K- Y#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。: @& m( H5 X5 r# O6 I, _& \
plot(lm)
+ S, \0 u2 n4 e3 ~6 B# p2 x7 glibrary(carData)6 V" V. T- L& G, @4 @% z& R. l$ r
library(car)
, t7 E' m' P- k+ U, r9 d5 CoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点$ @0 o8 w' w: i, \
' S @8 f' J2 M4 e T#10$ f( [* f8 I7 Y/ R8 s
#删除异常值记录后重新利用多元线性回归模型拟合数据。- V* G2 \( k/ H A$ V/ h
data4 <- data4[-136,] #删除该点
- f7 n+ b( o1 H" Ox1 <- data4$x1' H4 K* i( l! C2 k. {( U, u" Z: A5 r) N
x2 <- data4$x26 Y1 T0 ^# V/ g1 }
x3 <- data4$friends
8 L- l9 P* i% Zy <- data4$salary
5 f4 ~" U) ]* b. @( clm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
, R6 G0 d0 r+ Glm.xy2
" x3 E0 T. ~# e7 u9 \6 ? x1 Q/ F& E A
#11
% P' X! `5 `7 p& g3 t, k# G3 e#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
; ~% z1 O8 i' ?" b, yvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)9 L6 g, c+ I, B, L7 i& v6 v
- [$ l7 T' x$ g/ M: h+ m/ \#126 l' U; }1 G6 X3 z& K( x
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
1 U" n% x" [5 _, ysummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
8 s2 c& Z/ r' U
2 e) W/ R+ q6 L; @- }0 e: l**********************************************************************5 E# E; x: Z: P) a" g
/ `6 r" c7 t4 Q J- k3 t
二、利用多元线性回归模型预测收入5 J" B5 q6 I* z" V% R
View(data4) #124条数据
9 \$ d" g# e Y$ L6 w; ~9 J#1 k6 W. W6 I5 L6 A. H6 H
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。# o* m# _- ?' I: j6 [4 e' Z3 G
train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集) v G8 q8 Z7 c( u+ M& D* L
trainData <- data4[train0,] #训练数据$ J, @! s, Z% X+ P
testData <- data4[-train0,] #测试数据6 N8 ~7 h6 P0 R2 Q6 ~! n: g' z5 M6 w
* l, v* L5 i0 M+ W#2
8 N; g* F& P9 ~#针对训练集,利用多元线性回归模型拟合数据。
$ j3 a5 j: r6 X2 f3 dlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])$ h! b6 I7 x2 C) s
. l/ y6 I* f( |! G2 D#3
9 K( L1 N: _% @8 y$ W% [8 B#对(2)中的多元线性回归模型进行诊断,处理异常值。
; y% j+ Y6 c2 ^1 P( Z6 O+ hsummary(lm.xy3)
" j+ [( v0 p& o# _3 k2 Q# n% Npar(mfrow=c(2,2))( C1 p* U, K% v+ L, W. A) r
plot(lm.xy3)
; ]$ _% A. u6 f# _; K* GoutlierTest(lm.xy3), C; f7 p& N6 S( w$ a3 W- [
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
& c+ B/ b& Z6 R" C2 A9 ~+ m6 ^% A
#4+ [: c) O" D4 _! v
#对(3)中的多元线性模型进行多重共线性检验并加以处理。* |) Y! T" H5 ]
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)% Z( u; j. f1 K9 o, B# W3 N. ?9 l
salary<-trainData[,"salary"] #引入的数据是训练集的数据; v4 m6 K8 z* I, u# g1 ~0 @/ L) c
x2<-trainData[,"x2"]0 a% M( Y( K- z; }- U+ Y; |' J
x1<-trainData[,"x1"]
( l+ z9 h) F; P; Z8 l+ G2 ^friends<-trainData[,"friends"]& A7 X! z4 f; x' n
lm.xy3 <-lm(salary~x2+x1+friends)0 f: h9 |! f# u; O# n3 o
3 ] p) e2 a, V! b2 D! G/ `
#5
8 J3 i0 [: \6 X- b' U- F: L+ c Y#针对(4)中的模型,分别利用AIC和BIC选择最优模型。. L+ \% X& p4 z9 z2 ~
#AIC检验,赤池信息准则,选择最小的
+ b, H! l4 `. ?4 HAIClm<-step(lm.xy3,direction="both")
- ~5 X' X6 Q" m, H8 W! X; U#BIC检验,贝叶斯信息准则,选择最小的/ C! f9 u; M# }
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")0 ^6 Q% e* ]& U U( k4 j' _; H
, T- x* e5 E9 L+ T% D6 y2 ]
#6
8 ^+ V( u1 _2 F#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型, A3 w3 u! A# h& S% k$ D
#这三个模型预测的准确性大小,并进行解释。
0 x) U* e( U) c1 t% S; p2 m! kAllmodel<-predict(lm.xy3,testData)8 r9 y% ^; q9 i2 Y" v/ l( N$ Y4 j
AICmodel<-predict(AIClm,testData)
; v) z( r3 ]/ Y0 u4 P) F# y! [& kBICmodel<-predict(BIClm,testData)- ]" |) \* Y* V% M% |; x
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差( F$ y' r# e- \' } k1 @/ z$ ?
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
* L1 k+ I4 \) w# B: W3 H#标准误差能够很好地反映出测量的精密度8 V8 O8 R0 V4 V9 p/ G
MSE <- function(x){ q' h' D1 J5 I) e; G& R3 f6 K/ b
mse <- sum((testData[,"salary"]-x)^2)/503 H8 L+ k' ^& \4 {3 C4 R# A( [
return(mse)
. M1 z; i0 z/ k. K}
, a- ] z! Y9 d7 { v/ I" H. ~MSE(AICmodel) #AIC/BIC/ALL是误差最小的
8 P m9 I7 o" g) Q5 Y: m D8 vMSE(BICmodel)& v, e8 X5 d6 R- E2 I
MSE(Allmodel)
$ _5 U1 y& X7 \$ @/ i% H; m, _: F4 c& r1 F
/ u7 [. O3 [7 P% x2 ?, @1 R
- E" f3 j: H, Y( T& } |
zan
|