- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40215 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12776
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景
* M; e, } C' U1 V& o/ X3 e数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素7 n, X- }% i" H7 g- _5 [% J
#1
4 h) x2 r0 j9 J#展示数据集的结构
' ]2 n9 A# a3 |$ y1 Cdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
; v! F4 [! N% s& K$ cstr(data2) #显示的结果有一列是多余的,需要删除
6 G1 {( D0 Q) C3 g0 ^1 n% e! ~- Jdata2 <- data2[,1:9]1 p1 k) N f3 k
str(data2) #删完之后的显示效果是正常的没有多余列
; f- M% m3 J% b+ h. }. R
3 Q7 A l% b& @- Z% O( R2 M- c3 { f#2
1 C1 D. q* O! O1 {* i4 q( {4 G#显示前10条数据记录
3 D' ?0 Y1 V* T" F- [& |" cdata2[1:10,]( T6 g; \; A; g) ~4 q X0 E1 N
J! i% h' `) e+ C( Z
#3$ c2 y( s+ m8 x8 ]. `' H
#将变量名重新命名为英文变量名- e% w7 l' @& E2 g! w+ b- \! E* s
cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
) X3 v# n& d1 V0 [! l& v$ |4 Lcolnames(data2) <- cnames0 U/ \ E1 O( u. l: j
View(data2)2 H5 Z# e, K# m3 j7 |
- [" p ^, l( l# Z- j#49 x: F' H7 r* _
#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
! m+ v. G4 Q* Ux2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))
& }: Y: h0 i# d) e' e$ o#View(x2) #①先算出居住时间/ X" B$ A [1 t( `1 s, g8 B. ~/ z
data3 <- cbind(data2,x2)& I8 I5 y, L( `9 t7 u
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条 ~2 o/ m' c6 O/ x
list <- which(x2<=0) X3 D. u9 O' `4 P6 ?, n
data3 <- data3[-list,]
^6 T) R' P6 b3 [. {View(data3) #删除异常数据后是125条数据
N& J; f' w& b) ^
) V( `) K! `1 W6 r7 S#5! o) Y8 L* q0 \2 S6 T9 a
#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。 k" J' d8 r, B0 k0 R1 A; o* [; u
library(lubridate)
/ ~# w6 b+ o, ]; }6 s( J- O1 }date<-Sys.Date() #返回系统当前的时间
+ J6 P3 N2 L7 K9 K) \nowyear<-year(date) #提取年份: W( ^% W# L+ b3 q& |
nowmonth<-month(date) #提取月份
: Q3 J; i" u9 D W" A3 H, f#View(date) #查看现在的日期: _( {" k! a. o4 @: |
#View(month(date)) #查看现在日期中的月份
# Q- @( \, ?7 p7 B- a8 E, {% ix1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
4 t3 b1 ^/ ]5 U4 kfor(i in c(1:nrow(data3)) ){
$ j! J) ^2 f/ w# `7 x6 s. X if(nowmonth-data3[i,"birthmonth"]<0){. A# a$ Q$ Z: p L5 J& H$ k
x1[i,1] <- nowyear-data3[i,"birthyear"]-1
, S$ ^" [4 R4 ~; A }else{- T8 o D. w3 ?# a; D! z2 J g
x1[i,1] <- nowyear-data3[i,"birthyear"]5 R! \: v+ B# v
}/ u. R8 ~& ^( J. X" Y, M
}* }" r; t# n" l* f3 o
#View(x1) #算出年龄x1,并加入到数据表中: A6 X+ f' k1 X3 d& J& ]+ i
data4 <- cbind(data3,x1) : D) u; q0 F; Z: e+ z
View(data4) #加入x1年龄变量的新表展示2 Z# u& M' G$ S' g
x2 <- data4$x2
; A. t, H% v, m/ }$ _ i, Z2 [; jMean.x2 <- round(mean(x2),2)
) O5 o w8 ]! Y7 m, L3 p. fMin.x2 <- round(min(x2),2)
/ a3 c5 j. V1 C, j lMax.x2 <- round(max(x2),2)
" e% H) S7 T4 a$ OMedian.x2 <- round(median(x2),2)# ?8 f) {& u6 [/ a
Sd.x2 <- round(sd(x2),2)
) B6 V# Z* W( v! ^# i8 mcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果
+ u5 l6 {# `# ~ H8 L8 nMean.x1 <- round(mean(x1),2). Q- Q% H2 a/ O2 J
Min.x1 <- round(min(x1),2)8 C! f" W7 Y4 t8 h9 z4 o; v" Z5 @
Max.x1 <- round(max(x1),2)
& d$ B, e5 z* W7 z/ O' c2 oMedian.x1 <- round(median(x1),2)2 u4 ]; d0 W! V- E T8 Y
Sd.x1 <- round(sd(x1),2)! V5 J! O* F4 ~1 q; W6 F2 g
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
% C! ~+ r, f1 ^. e2 K% Dx3 <- data4$friends( [( q' q) E" N: ^ d$ x! a1 Z
Mean.x3 <- round(mean(x3),2)
* `$ V2 M3 |( x. Q# gMin.x3 <- round(min(x3),2) i; |* H8 l8 N' U0 w- [7 y
Max.x3 <- round(max(x3),2)2 ^3 P2 s% o0 C( |
Median.x3 <- round(median(x3),2)/ x/ k( B. b8 I( R% {7 t+ A
Sd.x3 <- round(sd(x3),2)
8 G7 U! Y6 r' B- `' F, P9 Hcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果$ j8 n' V$ x3 q4 M4 E1 x W
y <- data4$salary
$ L- {1 a/ F+ C9 ]$ G$ o) hMean.y <- round(mean(y),2): Y3 X' A! d2 T6 K7 E% T( W
Min.y <- round(min(y),2)% h, E: ^5 Y: D5 e- g
Max.y <- round(max(y),2)- ~( _2 t6 E' b
Median.y <- round(median(y),2)
# `! O) S. `6 K% i: VSd.y <- round(sd(y),2)
) G, h4 k( ]% \; U4 P1 Ecbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果6 g8 b% A& A9 V, e
1 A) h1 v- [8 m. ~' F5 S+ A; {#6) ^+ X! I+ S, Y/ Q+ x
#计算数据集中因变量和自变量的相关系数,要求保留2位小数。% ]6 D3 u. C) {5 y. A7 E
round(cor(y,x1),2) #y和x1年龄
; I S O2 ]' Xround(cor(y,x2),2) #y和x2居住时间
, k, j! `4 k7 W* C6 X* Y1 fround(cor(y,x3),2) #y和x3朋友数量- a9 b6 [) Z! n' Z6 B4 _
/ J" Z' W' I3 b1 p/ }#7& r7 O! B; R- a c4 a: @7 Y3 h. u
#分别绘制数据集中因变量与各个自变量的散点图
3 s) ~4 q2 w: Z9 B- apar(mfrow=c(1,3)) #布局,一行画3个图
q) @/ [5 ^4 O1 C( Y& h+ wplot(x1,y,xlab="年龄x1",ylab="工资y")
w# [4 g: m) Z9 nplot(x2,y,xlab="居住时间x2",ylab="工资y")5 E4 t0 n2 k& ]1 R5 q: I
plot(x3,y,xlab="朋友数量x3",ylab="工资y")
0 ^) h0 q/ U7 @+ I; _
" O5 s6 V( d( e4 }: `6 S#8( n8 I5 u8 ~; u9 L
#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。) w( p$ _# h+ X, J
lm.xy <- lm(y~x1+x2+x3)' A: P- @1 @: ]4 j" J
lm.xy1 J5 X7 \% O: C3 X( _8 D' W
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的
m9 c, L% n8 D% n3 t& I' |( r* _7 M, A. l' l4 d
#93 N& T: t1 P# a5 K) ]4 p
#对#8中的多元线性回归模型进行诊断,确定异常值记录。
6 e2 U- ?. y; C) x0 epar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列
; O- W: H+ r" _6 z$ H$ Y0 i8 g& k9 t#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
8 i6 z* Y* W }6 {$ G8 S$ \/ M#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
; {5 F, M8 ^" i; n) J7 n# u#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。
* p( J' ?6 g/ B& A#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。' b' S/ @& M4 B2 ^: v. }& V- A ?
plot(lm)3 t6 k' {) T+ R, K: C
library(carData)
( N* I5 H. f" d4 _6 z, Zlibrary(car)
+ {! h, S8 H/ LoutlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
3 V" e1 H7 a: E) J
* A' I3 l, _! k8 s9 x1 M, r#10
. [ n. }8 Y$ j& e#删除异常值记录后重新利用多元线性回归模型拟合数据。
" M; d! P3 ~- D; G! M2 idata4 <- data4[-136,] #删除该点
/ i) \: x- \& o u2 ^/ @x1 <- data4$x1
; J4 U6 f0 U+ `0 o3 Z0 a$ O) Lx2 <- data4$x23 l4 g9 H( g2 y% b5 U$ T
x3 <- data4$friends6 M* v. l$ x* p, `; j5 J- ^
y <- data4$salary
E9 t1 u8 a0 k- ulm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
% H8 \' j! h& N7 ?$ q. [5 x2 {. {7 Ulm.xy2
! [% ?: Z1 m2 { ?6 v! O9 H' I; ^
#11" [5 P7 s$ n+ @1 ?- c! u% d
#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
: n; q. w' m' L- }% k# }, Bvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
% D/ H- X2 r: y4 ?9 L! {( [: w# b$ x) u2 C0 e1 K
#12
. N, {, A8 ^) R; j#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。1 [+ u. v: k1 s d
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星0 t% R% f1 }8 X/ g( K
' h- ^1 u0 Z4 w: H. s+ L
**********************************************************************
6 ~' T. [9 _2 I3 I& ^/ c8 J
M7 V$ l. [3 ^3 |1 N二、利用多元线性回归模型预测收入1 x2 M' q/ |# U9 z5 w
View(data4) #124条数据# m0 L/ O5 z0 ]! F* B
#1
1 E# Z& F6 o- }) D#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。3 f9 H8 A" i) @/ Z
train0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
8 b4 A' x x: Z7 N: ]) RtrainData <- data4[train0,] #训练数据4 T3 @' c9 \% P" Q% K0 ?0 W
testData <- data4[-train0,] #测试数据( `2 ?0 \! {, O/ J1 b
% {3 U% Q- j: A; F* C; x& }* P#2/ M( i+ C4 y: J( w! N
#针对训练集,利用多元线性回归模型拟合数据。& G# c% u# R/ E, G5 ^, s; `) E
lm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
" N3 J& p, J, d/ `# U4 h9 n
5 j& r, A; L: H* I3 q* K4 D#3% U' H6 E3 J3 f, h: ^% L U
#对(2)中的多元线性回归模型进行诊断,处理异常值。
% \) I2 y( S# F& I3 M5 @4 Gsummary(lm.xy3)
+ G/ u: i5 B' _) vpar(mfrow=c(2,2)). [# C; C7 B. K; V8 [7 W/ K% H7 {3 C K
plot(lm.xy3)
) `& a1 i! d4 E0 O! SoutlierTest(lm.xy3)1 _* B' Q. _; z d+ g
trainData<-trainData[-c(150,32,82),] #删除异常值,随机的
; H9 R* y! K3 S1 ]6 I9 P# R+ z+ A0 X9 \' Y& Q
#42 W( S9 Q! u: W, |9 O0 a( Z( f
#对(3)中的多元线性模型进行多重共线性检验并加以处理。8 q5 S$ `/ M; |# }& ~
vif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
- u3 {* A$ x1 w" E+ C$ y Msalary<-trainData[,"salary"] #引入的数据是训练集的数据
7 x% |6 E( [, `/ n* O3 gx2<-trainData[,"x2"]
4 f i/ |- m% n+ ]( rx1<-trainData[,"x1"]
& P K+ N. W( ]friends<-trainData[,"friends"]6 [ X1 ]# p7 L+ N- ^
lm.xy3 <-lm(salary~x2+x1+friends)
9 O" Z' w% M( f- `# y2 @# w2 u0 o/ m$ w; l' p" l( i
#5
; ?' r! s; b2 n1 e' z! F3 U+ i#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
6 G6 ]+ @2 P7 g# C* C#AIC检验,赤池信息准则,选择最小的
4 p9 G! U( |! O% U# A5 i; |! EAIClm<-step(lm.xy3,direction="both")
" t/ F, P2 Y# U#BIC检验,贝叶斯信息准则,选择最小的
7 ^0 V& @* J. wBIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
! A1 `( K9 H4 Y5 s( S( l9 I
4 d, }+ Q0 f/ V; o, ?/ I: K#62 ~9 |: ]7 E- n# R/ Y
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型
. @5 t2 D3 x7 d3 V: O# ?#这三个模型预测的准确性大小,并进行解释。4 m2 {3 ]& A# b, C
Allmodel<-predict(lm.xy3,testData)8 X/ `2 \/ p$ ^$ g2 Y5 A
AICmodel<-predict(AIClm,testData)
# x$ C e! w t" s6 Z) D1 DBICmodel<-predict(BIClm,testData)
# {/ y# h( _" ^' c#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差2 [& x* H" T/ k, u) E
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根
7 P. N' H, V3 |/ z; E# b; t, c#标准误差能够很好地反映出测量的精密度8 k! k" z: r9 F5 v* _
MSE <- function(x){
9 t4 e( E' \9 @ a/ I* M. z, k mse <- sum((testData[,"salary"]-x)^2)/50
5 B! X) A( W+ ]) C( X2 Z+ ~, z return(mse)
# v! J9 \4 ~2 f/ s: J1 j}1 K& |( w# {* E$ M3 G
MSE(AICmodel) #AIC/BIC/ALL是误差最小的
% Q3 G; ~6 {4 z2 S( [- xMSE(BICmodel)4 V" G6 V1 w1 w0 O5 ~! I1 T
MSE(Allmodel)4 P. A; W7 G2 p e# L
" P* s$ r* i- ~. r; f8 S
z; B% f- |& u# M- L! d
8 S( V! c+ T+ J& [0 f2 T& o" C |
zan
|