- 在线时间
- 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 多元线性回归 一、背景1 o, l( ?1 ], J" n5 U% n# m
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
3 m& b% y! |. n#1; }0 `' }% ?) M& z \3 k+ y$ g
#展示数据集的结构" g) P0 ~* u$ k) q! B
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")( |1 A) _# A4 E1 q7 f C
str(data2) #显示的结果有一列是多余的,需要删除8 I: o9 S: {2 Y0 R1 `- {: A
data2 <- data2[,1:9]
2 y' f! {* }4 B' m! Gstr(data2) #删完之后的显示效果是正常的没有多余列' e# N! O+ L( @" P2 l
% H( E1 }7 ?+ N% ]
#2
7 \4 [, D" R' N6 n E4 S* }#显示前10条数据记录! D3 b$ A B& @" P1 q5 i5 f
data2[1:10,]; e$ V) Y. A, _9 |# n2 R
# o* n3 a9 Y& b J; L: V% b9 [: s#3; y% p& h! @/ [7 {7 X V
#将变量名重新命名为英文变量名# O4 |/ w7 `# Z0 r9 Y7 w
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
% F1 g: k q* w3 r' m% F* B) _colnames(data2) <- cnames; S" p' \( d1 ?8 {( V8 L2 Y
View(data2)
% j$ e2 v) q m0 M$ x$ Z) `, j! W0 |: c: Z+ Z$ b9 N3 Y
#4
; x5 Q' P6 l9 o5 k#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录* Q$ x: h7 Z4 d
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
" b- K" g0 n, W/ k#View(x2) #①先算出居住时间, E" _' ~5 \2 A
data3 <- cbind(data2,x2)
a! C. Y; K8 M8 Z) a7 V& Z6 F3 \#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条 {) i/ _/ }( ]; k1 C8 @- U
list <- which(x2<=0)$ A% \8 N8 v* h) O, d8 i
data3 <- data3[-list,]
, Q0 v: `3 I/ i L, l4 XView(data3) #删除异常数据后是125条数据1 _/ \8 c/ _+ a D/ Z) v' W4 N. r
' }% y$ b% o( r$ a# \0 B2 W+ g#5/ p0 E$ ^: j' Q+ S% c
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。+ Q6 J7 ~, c) W, I0 G* f7 J( U
library(lubridate)
2 ~# |3 D# w+ p7 o( sdate<-Sys.Date() #返回系统当前的时间
7 v$ c9 {# v9 s9 W$ ]- K% c3 u. @nowyear<-year(date) #提取年份: O: J) }- i& w
nowmonth<-month(date) #提取月份" v) k/ s1 F4 }8 S+ J
#View(date) #查看现在的日期
6 l' Z) X4 d$ F0 Q- [9 D7 q0 Z#View(month(date)) #查看现在日期中的月份
m$ x, V3 s( I) R% r! H& lx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))5 p2 |* g u' l7 e6 p) o a
for(i in c(1:nrow(data3)) ){
* O0 Z- u' g1 W# p8 p4 S if(nowmonth-data3[i,"birthmonth"]<0){
% O e. D5 V2 P% S* I* x x1[i,1] <- nowyear-data3[i,"birthyear"]-1
4 L2 G/ T W. W7 ]/ ^ }else{
0 d1 W0 q/ i7 ~) y4 y$ K% E x1[i,1] <- nowyear-data3[i,"birthyear"]( F- Y& B1 ~# |3 d6 r
}
6 |3 _* z6 S( n! r( S% m. ^9 G8 ]}. J/ B. H: j! @+ o7 p6 z8 Y
#View(x1) #算出年龄x1,并加入到数据表中9 p1 B9 u" o* e2 n
data4 <- cbind(data3,x1)
( ]5 c; j; Y! }& [6 |0 W. u! k2 g& T& bView(data4) #加入x1年龄变量的新表展示
1 p: q# ~6 @! G I) P+ v9 ix2 <- data4$x24 S9 ?6 Y: r5 j
Mean.x2 <- round(mean(x2),2)( Z: F: E/ N' x2 i
Min.x2 <- round(min(x2),2)
3 W8 W {5 K1 T6 M1 P; MMax.x2 <- round(max(x2),2)# g s3 b( u& R. x
Median.x2 <- round(median(x2),2)
! R5 [# h. ?/ y" u1 R+ F8 ZSd.x2 <- round(sd(x2),2)
2 Z- v: M7 c7 K" Z% `+ Q+ xcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
/ a0 }3 [/ X- _Mean.x1 <- round(mean(x1),2)
- @3 r& k0 p8 ~& W/ B4 c5 C; b5 sMin.x1 <- round(min(x1),2)/ R) x/ e* _5 y, H, {. i2 N
Max.x1 <- round(max(x1),2)
7 l3 e3 P6 J5 yMedian.x1 <- round(median(x1),2)
- [) s+ M# C+ s: K. }( c5 mSd.x1 <- round(sd(x1),2)
- E; L, B8 j8 T7 tcbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
+ ?- S9 _" ] @7 }( a1 y! ex3 <- data4$friends
3 [& A4 P) ?) @( x& }7 d/ H& ZMean.x3 <- round(mean(x3),2)
5 N1 p+ \. @, u7 c5 ]' NMin.x3 <- round(min(x3),2)
% s! c/ g! g% w* A4 N& @Max.x3 <- round(max(x3),2)1 G- E, r6 H( b+ ]
Median.x3 <- round(median(x3),2)* C% y- T5 u9 T1 R, f" H
Sd.x3 <- round(sd(x3),2)8 o) \. M" e# o8 N
cbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果8 `; s/ K9 y& D% K
y <- data4$salary
/ c+ p0 Q1 ]- i6 J* D1 @Mean.y <- round(mean(y),2)
' h% a; |4 Y: `; IMin.y <- round(min(y),2)
3 m/ [5 G" `- |/ JMax.y <- round(max(y),2)# d7 H- M( U& n! q6 m" @- x4 g
Median.y <- round(median(y),2)
( X }! q, `% Y5 w2 {4 ASd.y <- round(sd(y),2)7 z4 j* S' T7 A1 L* E" V) p% h7 `
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果
" I+ Q& _+ N* z4 b: t
: t; S8 e4 t+ T$ g+ X: F1 |#6' I8 q1 O/ `3 U h: o
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
; }7 ]; ]( P( x' h7 n9 L0 G7 U; Ground(cor(y,x1),2) #y和x1年龄
/ h! X/ X" @+ m2 \& H9 y) Eround(cor(y,x2),2) #y和x2居住时间
F* ~3 C0 P. T1 F. [* \ L: ]round(cor(y,x3),2) #y和x3朋友数量
# ?8 w& ]- J; i( X3 @6 g! ?# q7 |9 Z1 n8 N* g% {" t$ W
#7
0 K: \, x) f, t! i* u#分别绘制数据集中因变量与各个自变量的散点图
0 ]/ }5 Z9 T$ Ypar(mfrow=c(1,3)) #布局,一行画3个图3 U7 F" d7 o, \$ a. S2 q
plot(x1,y,xlab="年龄x1",ylab="工资y")
! P! R1 s0 s5 q5 w3 L) Mplot(x2,y,xlab="居住时间x2",ylab="工资y"). P0 `* `$ V& S( ]
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
/ _; E) e2 h6 l5 u8 M
/ z. p( k9 N" T& y" d#8
4 |/ t5 ?& L8 M. T#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。8 o. [8 s! ^ Z3 Q
lm.xy <- lm(y~x1+x2+x3)
# B1 e* }/ h+ w( l- F' hlm.xy
: i5 i2 ` M$ ?9 m+ f7 s1 Ksummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的. O& j' b0 C/ d) p1 S
# P3 [! o3 Q. ]% \5 s+ t. d2 K; h$ R0 p
#9" J9 n: d( o5 o4 K) L9 D. T
#对#8中的多元线性回归模型进行诊断,确定异常值记录。
& N. u8 G6 W) Qpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
& s8 Z, b5 t! k, t7 n#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
. c3 n; @ M& q* S#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
7 v3 \, }) ~( q' u3 x) N0 Z1 l#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
$ o3 e- y; }8 l0 ^, N$ M' i#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。8 H1 \3 l) r! {4 ?* Y5 U0 q
plot(lm)) Z4 J, b4 C( r. Z2 Z+ y
library(carData)
4 q' [" |' |% j8 b0 ^* i8 }) a! wlibrary(car). N: E! C1 z% D y+ b
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点 ]' u H6 q* _# Z d+ ^' a$ [
7 A3 \9 L8 x! G$ L: f9 M#10/ T& X( n# a7 x! L
#删除异常值记录后重新利用多元线性回归模型拟合数据。+ k, I5 B4 |( J
data4 <- data4[-136,] #删除该点
7 V1 k! t. y# \2 N* Hx1 <- data4$x1) J% a2 g8 l0 Y. U3 `7 c
x2 <- data4$x2 f* d( W" h" o0 D$ z! w
x3 <- data4$friends) P" w3 l5 h9 U- J$ X
y <- data4$salary+ m6 a" i9 h4 _, x7 T; o
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型/ @/ q' \$ D3 F" _6 G: F
lm.xy24 f+ _8 |' ?& W! M% {
4 | }. D2 Y! v; r# N \
#11) C5 P! g7 Q% `5 Q1 K
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
+ e) K8 J9 v5 E7 w& W/ f ]vif(lm.xy2) #p判断多重共线性0<VIF<10(不存在). y+ i6 X! q" u P! j6 F
% I* u6 T, [- K7 Q: V) p#12
9 N' V6 _: T3 Z9 D#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
, B5 @. h8 ]5 B1 w8 Jsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星7 j: @0 d1 i. \- _& J
$ r9 o6 A% L. S**********************************************************************
2 t, X& N1 u- x( g s1 ?5 F5 j& Z+ q) S
二、利用多元线性回归模型预测收入
' R/ \& ~! g K$ ^' w( j3 GView(data4) #124条数据( M( O' U- k w- } [! {
#1
; p2 k ]( M# ]9 C% U% E$ h) C#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
) z9 l# |; |9 L& V. n& ytrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
* ?9 o7 K$ o0 Z& |trainData <- data4[train0,] #训练数据
3 {- w/ z. h2 u0 btestData <- data4[-train0,] #测试数据
# Y h1 H0 s& T: q: G7 c; X% j) a3 O a- M
#2
2 W2 ]3 s9 U ^' m1 N( W) R#针对训练集,利用多元线性回归模型拟合数据。
6 Q+ a7 m+ h, p' S: f! y8 Slm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])0 m* W5 P6 c1 M8 D1 q/ w5 J
4 c9 J8 R4 L/ d' R# r
#3
. I/ Y' G, b* T$ a#对(2)中的多元线性回归模型进行诊断,处理异常值。2 \* A' M- d% T5 v1 y
summary(lm.xy3)
- i) c+ G" A* [- b& x) ypar(mfrow=c(2,2))6 q$ |, E* n& Y$ U$ G8 ~8 ~. n
plot(lm.xy3)) k1 b' f; X$ K# _5 S
outlierTest(lm.xy3)0 G" N0 q# P7 y2 R: M$ I, Y
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
# Y. s# \; L# j L- f; }6 j4 s4 D; d' x: e- p- I
#47 \# Q7 d9 {; U# D: i5 g
#对(3)中的多元线性模型进行多重共线性检验并加以处理。
" ~, J9 x& U& x! J% Jvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在): f3 g/ T" e7 e$ y2 t7 ^
salary<-trainData[,"salary"] #引入的数据是训练集的数据7 d: N$ e2 V* ]4 h% G" k! c% B1 y
x2<-trainData[,"x2"]
$ _0 N/ M5 d* Ux1<-trainData[,"x1"]2 R e4 i6 H; d0 H) A, S
friends<-trainData[,"friends"]; A- j* ?) n$ s# L% E% `# O: U5 t% _6 X
lm.xy3 <-lm(salary~x2+x1+friends)7 N' g3 c& q, S0 q0 V
* h; X+ r* ]/ ^#54 @5 y5 q: y+ ]+ d
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。1 K/ R. i& i; H8 P2 e. J
#AIC检验,赤池信息准则,选择最小的
1 N) a# }; }* o7 P+ uAIClm<-step(lm.xy3,direction="both")- d1 W$ G; Q$ I
#BIC检验,贝叶斯信息准则,选择最小的; `, n( Z, B+ [7 u
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")6 H+ Y$ i) S( L% F/ [8 d1 D% O# X
; [$ T( |& e0 \1 z/ {
#61 u' J, s- }; F2 g" e% I
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型. t _% i3 t& e; h
#这三个模型预测的准确性大小,并进行解释。) m# A: l8 a* L8 \! U" s
Allmodel<-predict(lm.xy3,testData) o9 k3 G. D7 X; w" ^4 F
AICmodel<-predict(AIClm,testData)
5 d5 R; Y+ A; x4 {! A( u/ G& uBICmodel<-predict(BIClm,testData)" ]. a+ @7 }( C6 \
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差
8 ^+ F8 H% g0 c* z5 G#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根1 @. ^" Z% P4 e9 t, V) v
#标准误差能够很好地反映出测量的精密度) m" P0 y$ F+ E& C7 l
MSE <- function(x){+ D4 v# j- y- i& t7 R/ X: y/ l& G
mse <- sum((testData[,"salary"]-x)^2)/50
; x. E/ r/ R6 G* C1 ?' b# D9 n return(mse)
: z% B1 G$ U: g7 B! Q; |+ L}
7 R/ g' E' v) W8 j# PMSE(AICmodel) #AIC/BIC/ALL是误差最小的
! ]! }6 z' a, H/ U: X8 l2 TMSE(BICmodel)% C1 R1 A; i4 k T3 u- U2 L8 U; c' o
MSE(Allmodel)9 m' s* S" {9 z0 s5 P
' l* [7 Q- ~& I i7 f7 t) B8 ~
# W9 c& H# H: ]4 R
' i% f( t% L. b8 Z# f |
zan
|