- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40103 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12742
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
【高级数理统计R语言学习】2 多元线性回归 一、背景
& k3 L6 X/ w( k8 X数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素( v( B, }* A c0 ~$ n2 k! n3 o
#1
* ^. `4 i" p0 q" i#展示数据集的结构5 }* I7 i7 g; r/ @# z8 Y
data2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
4 b9 I8 B' x) g# B/ P1 z+ N8 B. Nstr(data2) #显示的结果有一列是多余的,需要删除
8 t+ ]) K. Z1 t3 W1 ]3 [0 Y/ Tdata2 <- data2[,1:9]
9 k G, r- y# b) v7 n0 Wstr(data2) #删完之后的显示效果是正常的没有多余列
! h% T" i$ H" S
0 _! u* \ u: B6 y% S4 p/ k* i#2
) g. t- a4 r$ o. d#显示前10条数据记录
/ S# @4 K, c" F( N6 W* B* rdata2[1:10,]/ d7 r) c J! ^, U$ M
0 C0 R: z! T' s) g" w2 |* ?+ O2 L$ m#3
. w- K/ g$ C2 d5 I+ |#将变量名重新命名为英文变量名 J! {1 R7 I7 X, S
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
* S. Y# Q7 z( r9 u& |colnames(data2) <- cnames% Q; z+ V& C! e5 p2 A% r
View(data2)/ u) R7 {/ i Z. e
* Y+ n `- p( H
#4
# s) @! c8 H. g0 z" }: R#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录# I" }' e$ P: S! ^
x2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
* q5 F! S! r J( i# j5 L4 c#View(x2) #①先算出居住时间/ M3 Q0 V% e' V
data3 <- cbind(data2,x2)
3 v1 S3 L) b4 _0 o; J+ M3 L#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条7 o) b8 V+ n1 h! |* ~3 H3 ~
list <- which(x2<=0)1 D' v- i8 g* A- P0 b( A
data3 <- data3[-list,]
$ z7 P1 M. v+ s# MView(data3) #删除异常数据后是125条数据
$ Y2 Q6 N# M( f4 b' Q$ x9 j g: q' t2 L ?% p1 v
#5
+ ]! W/ ]% @* P#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。) u& C% h, v8 o
library(lubridate)% t4 B0 t$ J/ ^" w5 I- S
date<-Sys.Date() #返回系统当前的时间' M+ q5 b- s0 R# U, Q& ?2 x$ b7 D! s. E
nowyear<-year(date) #提取年份3 Z& I6 f9 `/ ~2 i6 J
nowmonth<-month(date) #提取月份$ ]# T3 r7 M* d0 V( x( i
#View(date) #查看现在的日期
( V% v' n: K4 D: A" i4 r6 C( }3 W: {#View(month(date)) #查看现在日期中的月份5 X! E2 }5 g5 L' c
x1 <- array(1:nrow(data3),dim=c(nrow(data3),1))" }$ T+ R7 o4 I) Z: V( B# M$ b
for(i in c(1:nrow(data3)) ){( }$ o, r9 q3 F8 Y/ q+ C3 A* G
if(nowmonth-data3[i,"birthmonth"]<0){
. h. ?3 h: G# c' F) T x1[i,1] <- nowyear-data3[i,"birthyear"]-1
% `# I! C$ Z U& {+ k Y }else{* B+ k1 X; ?$ z" J8 [1 H* ]
x1[i,1] <- nowyear-data3[i,"birthyear"]$ r8 |9 w; \1 B) l; _
}7 y k% b& K5 G! i9 d
}- Z! n( y N. U1 M4 z
#View(x1) #算出年龄x1,并加入到数据表中2 a8 i8 E+ d. _% H
data4 <- cbind(data3,x1)
+ {; q6 b" E+ H5 fView(data4) #加入x1年龄变量的新表展示$ C) b4 d% p0 R& D8 T ^ n
x2 <- data4$x2
" u8 D$ {0 |6 E9 U' [( Q; E# `" }Mean.x2 <- round(mean(x2),2)( H) a% B P; J/ K6 x
Min.x2 <- round(min(x2),2)
/ c) v8 K4 H; H! s7 J5 WMax.x2 <- round(max(x2),2)2 ^4 I* g, M9 T$ V
Median.x2 <- round(median(x2),2). l! O2 K) b$ O
Sd.x2 <- round(sd(x2),2)- ~. i( B- M$ j. P! n# g2 G
cbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
4 X) u+ ?* C& M. jMean.x1 <- round(mean(x1),2)
6 {0 u( T- `& B ~" h, VMin.x1 <- round(min(x1),2)! e5 k/ f) R$ P- @7 T
Max.x1 <- round(max(x1),2)3 \6 S' @. p9 T$ p
Median.x1 <- round(median(x1),2)4 f* }; k; |2 A" P2 j1 P
Sd.x1 <- round(sd(x1),2)3 Y* h! L) A5 Z" b1 M- O
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
5 J, G1 B3 I g1 sx3 <- data4$friends
b9 X, l, V( l; qMean.x3 <- round(mean(x3),2)
1 Y/ J6 @2 v2 E* `+ E* P. }Min.x3 <- round(min(x3),2)( j* G) m3 {2 }2 l; D* f' ]8 K
Max.x3 <- round(max(x3),2)
$ K- ^0 l ~. B3 Q9 B6 SMedian.x3 <- round(median(x3),2)3 @+ Y* W6 E0 X# N d# ?
Sd.x3 <- round(sd(x3),2)
k8 l: ?, j- Tcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果9 |) ] q5 p+ Y
y <- data4$salary
: a! K$ d" @ P6 w6 WMean.y <- round(mean(y),2)
. O7 |! n$ @% I! @( _. ]Min.y <- round(min(y),2). X3 r: V5 l$ d6 }; \, h
Max.y <- round(max(y),2)
+ |, J3 R4 H$ XMedian.y <- round(median(y),2)0 u8 D/ F2 ~! N2 n0 ^
Sd.y <- round(sd(y),2)( z, K/ b: o, b H3 @) c: y
cbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果: ^ e! c6 s" b' S! v; i
0 ]8 o* l3 v& G- O#6
( c3 A+ b. I* t9 \7 p) F# k; C#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
0 F7 k2 u! U8 g- K* W" Lround(cor(y,x1),2) #y和x1年龄
0 ^& U/ w9 H& x/ c$ j# U0 [round(cor(y,x2),2) #y和x2居住时间8 s6 _; N2 o& L9 |
round(cor(y,x3),2) #y和x3朋友数量
6 P2 L( i+ q' _$ i8 W+ \) T1 a$ _' z [1 }3 ^ H& A* W# c
#7
" a& \; X& u- D- ]' |' T- h#分别绘制数据集中因变量与各个自变量的散点图
/ N6 ~& ^' x8 z2 I& Cpar(mfrow=c(1,3)) #布局,一行画3个图 j+ i6 m/ d; h9 i1 ~7 X$ M
plot(x1,y,xlab="年龄x1",ylab="工资y"); L, w8 k* K$ I6 R! }/ c
plot(x2,y,xlab="居住时间x2",ylab="工资y")
- G V. ^4 Z U- X6 Xplot(x3,y,xlab="朋友数量x3",ylab="工资y")
; S. D2 U" j- P& B" ]
: H$ q0 K! H" k( u0 y#85 b5 I: P a! t& i
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。
8 ]- I1 ~$ U8 p7 z4 p* vlm.xy <- lm(y~x1+x2+x3)2 P f' x; C) `/ p! e0 M# A U
lm.xy
3 U, r) I* @% Asummary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的) E" C! {3 U0 z6 C7 |4 v: W
! [6 q& g, F8 M
#9
& `! ^% e; U# @' G B#对#8中的多元线性回归模型进行诊断,确定异常值记录。6 E( z4 Z* c- H% w- m
par(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
* m. f9 L0 c: Q. P#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布% [* n# c( ^3 D5 y. U* T
#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。. s. e7 M2 h7 [$ a
#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。5 R' r4 ~, ]* A- Z3 _) D* x
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
' D; U) x& |! H% [plot(lm). w" A: ?% @: j1 _
library(carData)
. a% I" |+ u# K/ }/ Alibrary(car)! f# o6 J- V8 b+ V. F6 ~: ]7 }
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
# y" ^; l7 Y+ u$ e8 a+ b* e: X X. e, A3 o, X- K/ _8 h
#10
1 h# V- W$ i& _4 x, ?#删除异常值记录后重新利用多元线性回归模型拟合数据。
+ c% |' o" g6 c$ p1 Tdata4 <- data4[-136,] #删除该点
% G+ Y! Q( w @ k" Ix1 <- data4$x1: `! B O+ P, X8 q
x2 <- data4$x2: f0 \2 q% }- Y; e/ e: s6 A; d
x3 <- data4$friends8 O2 y8 J: O, r" g
y <- data4$salary2 ]" w) `5 a9 L/ P V1 N8 h0 B3 a
lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型" f4 j+ S* Z) ^7 C5 w1 [- m
lm.xy2
+ J$ b u' F( p' L( o4 J, a+ X/ H% C
#11 ~/ o. m% H( ?" W* T# N& E7 G+ Q
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
5 b/ r9 v0 {$ P# V' n$ F Ovif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)/ l/ g/ J, L5 Y
9 X( D8 M8 J. j3 v5 u4 e2 S
#12
, h" Z( N* b. Y" y#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。
& A2 p& a7 M7 t4 c7 Fsummary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
% m( B9 b! ^+ U. F* d, u- ^
. x6 ^. W* N; a: G1 w, p3 u- _) h**********************************************************************0 G2 b# a b: A
5 m m# M, a0 @9 @二、利用多元线性回归模型预测收入
0 E3 x0 ~ e+ C6 H+ ?- c6 FView(data4) #124条数据
2 b7 R. {' R4 D1 K, L#1
9 [5 h s0 ]- Z. E4 R#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
: _) g/ q y i' t; xtrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
8 e. D6 G, T* J1 b1 `% v& a9 q4 ytrainData <- data4[train0,] #训练数据8 j" v. Y( R4 X' d$ J0 N' r) Q3 M
testData <- data4[-train0,] #测试数据
. X9 m" S: c2 ]7 a& I( F% B; Q1 {' D
#2
, e( Q* F$ ?4 b. X#针对训练集,利用多元线性回归模型拟合数据。
! k3 z! W1 E( K, \; W7 b& g; {, Nlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"]) B% U1 z0 ?5 ]9 n) H& O* v5 X
1 w6 T, w. h& J0 L* n, B
#32 T# F$ a6 I m+ X
#对(2)中的多元线性回归模型进行诊断,处理异常值。8 u$ d* j! F" A' Z/ [
summary(lm.xy3)5 O- O9 L" x: L: u
par(mfrow=c(2,2))' Q, R/ U4 p, l" M, A) L% L
plot(lm.xy3)& ?' |2 | I# K
outlierTest(lm.xy3)
5 i& Y! i9 l5 f# V# c$ v4 z7 R: NtrainData<-trainData[-c(150,32,82),] #删除异常值,随机的
0 z8 f6 t# H' z! i3 r& j; r$ Z" J+ K i! w5 `; M" t
#4
+ ~6 n" E, I; c#对(3)中的多元线性模型进行多重共线性检验并加以处理。. p4 F: {+ @4 B) F1 T; N
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)2 M0 q y* N" Q) Y' g3 M
salary<-trainData[,"salary"] #引入的数据是训练集的数据5 L4 p: F& K; D# o2 p/ p
x2<-trainData[,"x2"]
! [. L$ B# D! _0 p7 tx1<-trainData[,"x1"]
5 [! W2 {' p) e* }- bfriends<-trainData[,"friends"]
C* k/ y# g, z% c2 |9 P4 slm.xy3 <-lm(salary~x2+x1+friends)6 O: f; w2 P% T8 g0 r
' y: z( r3 A1 x4 b* x#5
/ _# O1 S& Q: ?: U8 m#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
5 N( s$ J1 x* L#AIC检验,赤池信息准则,选择最小的/ f# Q3 Y, ~ e+ z+ I+ O
AIClm<-step(lm.xy3,direction="both")" m9 v1 B$ _ [ `2 N9 z
#BIC检验,贝叶斯信息准则,选择最小的2 F8 ?% d+ Z. f7 V6 V+ Q
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")- |! v8 T+ A, u2 h7 Y/ u
, U) N* W3 |! s# m6 G% n2 M. A5 C#6 L/ g, \* N% \1 V% k; `6 H; f- }% n' [7 ^
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
+ `; K7 ]! s8 y1 s% B#这三个模型预测的准确性大小,并进行解释。2 O2 y* V- ~0 _" k* h. k) s: y
Allmodel<-predict(lm.xy3,testData)
) V; L+ q& c& D$ D2 u1 GAICmodel<-predict(AIClm,testData)
4 N8 @5 c- r3 V$ d7 \# fBICmodel<-predict(BIClm,testData)$ }+ v: p; t8 A4 Y
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差. }' L$ h3 F0 I0 b/ a' W; N7 M2 v+ O
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根; f4 g' K# s; l, v r
#标准误差能够很好地反映出测量的精密度
}& \+ V. g& V, SMSE <- function(x){
* G- M- |3 d- p+ V( I3 K0 O mse <- sum((testData[,"salary"]-x)^2)/50
z& Y7 a9 M4 s4 n# U return(mse)
+ J( k B% ]+ I7 p7 I}8 b _' l) Q: |" K/ ?9 C) g
MSE(AICmodel) #AIC/BIC/ALL是误差最小的9 I6 m; D, q! d; L: S, m6 M
MSE(BICmodel)" ]- [8 w3 a# p. q' e' p: B
MSE(Allmodel)
4 }+ L( a$ }* I$ x6 j- g+ U, ?* b! k( E- P
7 T: t1 N, j4 j; h' [
" s5 l5 @/ ?) E( A* {+ v3 V6 z. z |
zan
|