- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40222 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12778
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景3 Z1 [! d2 i- \) A9 F0 m# @3 q
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
. _2 ?5 | n( \- v* U#1' X$ U" R: C! c8 L6 k( q! d
#展示数据集的结构
1 w; Q0 N& Z- o2 G+ d; z6 kdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=","); q y4 {/ Y, x/ C8 j+ f3 W
str(data2) #显示的结果有一列是多余的,需要删除
7 a6 s5 F) N" w9 J- w3 N& t$ _data2 <- data2[,1:9]8 A. {! O4 O& U0 V: w2 Z8 \
str(data2) #删完之后的显示效果是正常的没有多余列6 V4 s' s+ Y% |
8 p% M% R! ^1 `& w9 P h. v& m! m
#2# V) v9 r7 e1 ]) `$ `0 b" |4 \4 z
#显示前10条数据记录9 L* b1 E9 v4 e |
data2[1:10,]4 M- { V+ W/ X; A8 m7 F5 ~
+ m8 m5 {& @8 |/ o+ I, a#3/ e" I: W# V$ J
#将变量名重新命名为英文变量名
/ J- V) u9 A1 n9 Pcnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")5 |9 p: Q$ ^2 `+ ?: i
colnames(data2) <- cnames9 E1 d. H- C J2 \5 ?) O5 `
View(data2)0 N* i3 m5 B5 x3 I" d0 ]
- g. d4 o o% M t/ P7 }1 N1 k
#49 r; T. h0 k% r* P5 j; Y! J, N
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
h/ X; M# b3 n8 P7 W6 G; z6 @! {x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
$ G2 o. B1 J" B K9 e+ }#View(x2) #①先算出居住时间
, ]5 X5 C% n: Idata3 <- cbind(data2,x2)
- e- C6 [- c0 T( B2 u! W#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
. e2 q1 v# \$ F, e( wlist <- which(x2<=0)8 O$ \% V. z% H/ _1 d. C' b0 F
data3 <- data3[-list,]
( `, W) R( I* ?0 W! gView(data3) #删除异常数据后是125条数据- B; H" k4 X, w9 X" E
# X2 u$ p1 L, N9 E( y0 W h
#5
$ q1 X/ i6 p5 X! a1 G#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。
$ O8 e4 o$ z( P& A# W& Vlibrary(lubridate)' F$ P8 W: k$ ~- k
date<-Sys.Date() #返回系统当前的时间3 c1 U9 z M7 C- U) A: [3 W$ T9 y
nowyear<-year(date) #提取年份
3 f. S! G1 c0 q, Jnowmonth<-month(date) #提取月份
! o# K- }. E+ \1 j5 W7 H7 v#View(date) #查看现在的日期
# {5 q- t- A' f9 b6 T#View(month(date)) #查看现在日期中的月份2 S' Q# ^$ Y) r& D! P( A4 A
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))4 h, \* g2 V% M5 U5 B0 J
for(i in c(1:nrow(data3)) ){* ~7 B# B. A0 U- I [! p
if(nowmonth-data3[i,"birthmonth"]<0){5 x- J- ?; X% x0 i( U
x1[i,1] <- nowyear-data3[i,"birthyear"]-1% x: j' k, F! y# g# ^& n0 \7 _
}else{4 O% ^% o+ n) J9 L' k; I/ Z: N% w
x1[i,1] <- nowyear-data3[i,"birthyear"]
' _! K" U' W; T- E }) a! N$ I$ S: W# g! Y0 U& l$ m
}- M) [+ N" a; S2 z
#View(x1) #算出年龄x1,并加入到数据表中0 q$ K" H! Y4 a! [8 W. R* w
data4 <- cbind(data3,x1)
* ]' R+ e; w+ I0 ]7 \' Q7 c( SView(data4) #加入x1年龄变量的新表展示
( G5 @9 h' a' Q {; x9 ]5 Q/ g5 _x2 <- data4$x2
0 q4 o8 k) a4 c6 c, p; K" I7 NMean.x2 <- round(mean(x2),2)
! s" P I5 h2 p( p0 WMin.x2 <- round(min(x2),2)
/ @/ s3 }+ R& b- G/ X& {Max.x2 <- round(max(x2),2)+ z% D; W. c5 z
Median.x2 <- round(median(x2),2)
3 P) d6 F8 [3 USd.x2 <- round(sd(x2),2)5 e+ I; ?6 D) F# J; `
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果& [# c- Z* G3 o; R9 }' m) ? N
Mean.x1 <- round(mean(x1),2)
7 ]& G* b. ~; k; ~Min.x1 <- round(min(x1),2)
- q2 d7 p7 P$ V* [4 MMax.x1 <- round(max(x1),2)* e# R- X3 U7 g. {, O) m/ W2 ?9 a
Median.x1 <- round(median(x1),2)
. M7 ^$ G4 G2 S+ r1 \3 u$ HSd.x1 <- round(sd(x1),2)
e9 Q7 u4 Z0 C! F; v8 ]' tcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
' N: E/ c5 M* r) p, bx3 <- data4$friends7 v5 m) c4 O" G" k* w
Mean.x3 <- round(mean(x3),2)
: @+ i7 p) @0 b& l: H8 GMin.x3 <- round(min(x3),2)
9 ]' L: E6 G2 D- h) j5 a$ yMax.x3 <- round(max(x3),2)
: _# v7 I) P" v( L' ZMedian.x3 <- round(median(x3),2)! {' D* }5 r6 e p( m, {" v: b
Sd.x3 <- round(sd(x3),2)
! O3 o a8 B9 J- @5 k# C9 ^9 ^cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果( h; j/ C+ h9 {6 S* ^* J! ~6 J
y <- data4$salary# V! W$ Z6 @8 F) G3 o M( ]
Mean.y <- round(mean(y),2)
# [( H( f b6 R7 a; B |+ |Min.y <- round(min(y),2)# E5 H' F7 ]: Z! B
Max.y <- round(max(y),2)8 V; t9 ~ m+ C
Median.y <- round(median(y),2)7 T8 `- b# s1 i. y( p
Sd.y <- round(sd(y),2)4 K% g" h; E/ O8 a' U* y5 F
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果; E4 E5 ^9 N! H* b0 V
0 ^3 l% [1 q" ?8 ]9 Z#6
, B4 D' D" x9 o# ]7 L#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
& i# {; j! ^) Kround(cor(y,x1),2) #y和x1年龄+ z+ @- J7 i- e; L$ x. l
round(cor(y,x2),2) #y和x2居住时间
x1 A5 m$ j- p) X4 O: jround(cor(y,x3),2) #y和x3朋友数量
+ U, _/ @" @; @5 g) i) A- P. P* D, K2 i$ ?( ?& R
#7' v5 o4 n) h1 S9 W, u$ {8 |" ]
#分别绘制数据集中因变量与各个自变量的散点图
* T7 q) i% U, H1 `par(mfrow=c(1,3)) #布局,一行画3个图& A2 b/ ?3 _2 [8 |% l7 s
plot(x1,y,xlab="年龄x1",ylab="工资y")( b$ \2 W6 D0 t( f, \; a
plot(x2,y,xlab="居住时间x2",ylab="工资y")
8 V2 _6 P3 ?. R$ E$ x! dplot(x3,y,xlab="朋友数量x3",ylab="工资y")
2 i) A2 A9 }7 k+ N, r( ?. l
0 F, h7 \8 ~& k1 D0 A) Z#8
]# c1 p4 k# M$ w: S0 E' ~5 m$ c#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。) h% G! }3 x7 g* ^% F
lm.xy <- lm(y~x1+x2+x3)5 m# ?) E: N5 `( [( D
lm.xy
$ x7 o9 G5 i" y$ K% W, h) `7 tsummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
+ r& k( |; v' d: M/ p0 a% h
- o$ z' [1 |: P0 V; o#9# G3 j: J7 y& r! H% C! `) Q2 Z
#对#8中的多元线性回归模型进行诊断,确定异常值记录。
, ^) H6 [/ \0 U& e. F! ?, npar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列; K3 T, g# b, `
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
2 u% `2 Q, z$ }4 d0 |#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。* p' S2 _5 t9 Y- g6 F
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
1 D1 E, o- q3 m' H#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。: c' ~, a0 k4 K$ K) r
plot(lm)2 n9 J0 i& l: f$ ]) C
library(carData)
# s4 T+ l: J3 d8 Flibrary(car)4 E' S/ V: w% ^( ~; m5 L9 P( q1 N
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点6 \. H% W- Q6 g1 N e
2 i5 O! I: ]8 g5 u& S, n8 W#10( {5 H, A1 r; }+ f
#删除异常值记录后重新利用多元线性回归模型拟合数据。
4 p# j7 K( Q0 D( `5 Adata4 <- data4[-136,] #删除该点
* z' Q4 M6 [: X& a' j1 rx1 <- data4$x1
* j* t) C! u( r7 l% Yx2 <- data4$x2
; r! {$ O- z3 F4 J" S( ?5 u' Tx3 <- data4$friends
; ^. W f, I& Ny <- data4$salary2 L# d7 l0 R0 n$ A9 l. A0 ]( O
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
( e# V# I1 `* Slm.xy28 z" |; A4 H* g
1 k0 U' G+ E9 g1 ^6 q2 a% }#11( y+ G' I' v5 L5 ~ k# `; w
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
' r/ s) _" ^9 j2 m5 n/ Jvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
# b4 D% {; p) g X% X1 H1 n7 V6 D8 S+ \" s2 o
#12; x4 z4 l/ y" e
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。! r" I8 H+ K8 m" x: m
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
8 T, J6 ~1 ?8 u% o/ S8 e
- f" j: @. d6 u! \1 E**********************************************************************0 [& j1 x4 ]" k- `+ C3 j6 f
% i5 T( g# O8 i8 e
二、利用多元线性回归模型预测收入5 E2 j2 p! Z7 Z3 O& W3 \
View(data4) #124条数据
* z' k+ [: ^( [) l#1
) b' g) ~0 k2 d# N#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
* r- H7 h2 s, a/ d7 D/ V& ytrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集+ ]) K _& @8 e2 ] ~
trainData <- data4[train0,] #训练数据
* J6 r/ B @: O: etestData <- data4[-train0,] #测试数据+ J0 d+ Y l6 H( v* t7 P+ G9 ^
2 Z% ^2 f" w; i#2
! g6 H. O* d; c+ _8 w#针对训练集,利用多元线性回归模型拟合数据。
4 a8 h$ Y' y3 B' N; Blm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])+ G8 s5 p9 i( G
: f6 n8 G9 T1 M+ M& l8 B
#3
. S3 s# `" ?: G#对(2)中的多元线性回归模型进行诊断,处理异常值。
+ r1 m. J) `! k. Zsummary(lm.xy3)9 q: h+ H/ g- d1 ?5 T$ N
par(mfrow=c(2,2))
9 K- b3 N$ m% ~0 e# y, k4 rplot(lm.xy3)0 k+ s: U& Y4 i# a" t
outlierTest(lm.xy3)
0 P- E. A, f! o8 A( w5 ?trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
# Y i' P, O" d+ N8 R/ w, X b. D2 g# Y
#4
) O! x ]# y# z0 ]6 W#对(3)中的多元线性模型进行多重共线性检验并加以处理。8 W! [- Y. v+ c) x- O! E, w
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
0 p* Z3 U- [- dsalary<-trainData[,"salary"] #引入的数据是训练集的数据
3 n! J' O# _% P, ?x2<-trainData[,"x2"]
: {3 ^4 V0 m" hx1<-trainData[,"x1"]
# s' s* m5 c; l3 kfriends<-trainData[,"friends"]
# C/ m2 R) O0 T; ?$ ^$ W$ |lm.xy3 <-lm(salary~x2+x1+friends)
. a! M. G9 W/ _8 w& N3 L5 C* w: n) n5 B7 A4 v
#5) P3 C, \- G b4 k/ m2 X1 T! i6 e
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。6 Y4 `! w ~( w) t! M% }
#AIC检验,赤池信息准则,选择最小的
2 e/ G4 V5 o; X7 f: c, k' UAIClm<-step(lm.xy3,direction="both")
; h" d$ }9 C1 R9 \: l- P#BIC检验,贝叶斯信息准则,选择最小的
0 d9 ]$ D- p4 k. JBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")) n0 \! m& P& e
, j* G" @$ | i/ Q7 a: M. G
#6
% c& |; i+ w/ v0 W' @$ Z2 ]% `#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型8 o0 g, b: ~. b: m) n, ~5 b
#这三个模型预测的准确性大小,并进行解释。
1 C! i1 A( I: m4 j* c3 B3 c% B6 CAllmodel<-predict(lm.xy3,testData)
" d f2 [' T! Y! QAICmodel<-predict(AIClm,testData)2 H7 {$ p( f- B& ?8 ^
BICmodel<-predict(BIClm,testData)
: O' ?) U4 A. W- ^#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
# K: i' X O" ]8 h#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根* u( }2 @. z; W- F+ _( ^0 B" L
#标准误差能够很好地反映出测量的精密度
; l! j& f, U- e/ ~# TMSE <- function(x){$ L( D0 u. \$ W" ?; x
mse <- sum((testData[,"salary"]-x)^2)/50" c$ ~* c& v9 X' ^
return(mse)
8 C0 R. N* L. ~6 R; d* [}
4 X2 t; ]4 ]( z5 s. H& YMSE(AICmodel) #AIC/BIC/ALL是误差最小的. I" l) m8 `$ d& z7 t
MSE(BICmodel)0 P4 |6 D- u, N$ w" Y
MSE(Allmodel)
: {' Z& l, Y" D" H+ C
; K# @" ?6 X: s; ?+ H1 m
/ V2 Z1 @, {) A. E6 L& U! A1 V
. b$ ~; v4 ~5 [ |
zan
|