- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40214 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12775
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
|
【高级数理统计R语言学习】2 多元线性回归 一、背景2 n! q6 o3 C9 S: ?! ^' \! s
数据集展示了X市外来人口的相关数据情况,包括出生年月、收入、初次来到X市的日期、迁离X市的日期和现在的朋友数量。现假设外来人口的年龄、在X市的居住时间和朋友数量影响他们的收入。试加以证明。 二、要求和代码 一、分析收入的影响因素
) ? `, c( U8 e/ K6 r#1
% G* v- d- p2 A8 g5 Q; v/ D#展示数据集的结构
! x- j- T8 Y: L& cdata2 <- read.csv(file="F:/hxpRlanguage/homework2.csv",header=TRUE,sep=",")
2 Y" t& x7 V; b& I2 A$ O* ystr(data2) #显示的结果有一列是多余的,需要删除
- l% \1 E( D9 M2 \. y& y0 D9 Ldata2 <- data2[,1:9]# J9 L' |% I: X: L
str(data2) #删完之后的显示效果是正常的没有多余列
4 B S7 A7 P! c7 @
- Y1 B, }/ x( T- j#2! u8 f& N4 h. g
#显示前10条数据记录: Z- F m% M1 ?$ u) A h, _0 u
data2[1:10,]% F' Z& ?) h1 C$ R& K
; s$ f! q& @/ H3 Z#3
. f5 {6 C; \6 |& e0 K! I#将变量名重新命名为英文变量名
1 N' Y+ S1 f: A3 s" L4 T$ ]cnames <- c("number","birthyear","birthmonth","salary","inyear","inmonth","outyear","outmonth","friends")
% @8 f3 S& N9 ^4 K9 j- mcolnames(data2) <- cnames
$ s3 }& I5 T) ^, W. Z: wView(data2)
' q5 t- e: z! A/ j1 p* l# e- v3 u
# @$ r% x# c( R; ]6 e#4
0 o( n5 I; W( c/ B3 }#查找数据集中居住时间小于等于0的异常记录,若存在,从数据集中删除这些异常记录
! n$ `9 H! @! h3 v; Ix2 <- ((data2$outyear-data2$inyear)*12+(data2$outmonth-data2$inmonth))6 n8 t& b5 a+ s
#View(x2) #①先算出居住时间5 Q1 \) k% l5 b, Z4 q9 s
data3 <- cbind(data2,x2)$ h& y7 l6 \" s4 N! Y/ h
#View(data3) #②使用cbind函数把x2和原数据拼成新的矩阵,方便之后删除异常数据列,并且是127条
' v$ \1 K4 o3 e# a5 a$ wlist <- which(x2<=0)
" g$ b9 ?: A7 R; j# zdata3 <- data3[-list,]
1 T y" A/ h6 V6 z9 TView(data3) #删除异常数据后是125条数据
. h0 E4 q& p) Z' U# W' `; ^* ^' w+ z/ E- |8 z
#5
' m4 e | ~4 B, J; g2 [#展示数据集中因变量与自变量的均值、最小值、中位数、最大值和标准差,要求保留2位小数。& h' B2 R9 a4 @2 p
library(lubridate)
( s2 L; E/ t x! mdate<-Sys.Date() #返回系统当前的时间
3 g2 }& m; L) {nowyear<-year(date) #提取年份
7 l- w& A: s4 P9 P/ O( U% inowmonth<-month(date) #提取月份6 I& \* Y5 O0 C
#View(date) #查看现在的日期8 ?# ~3 N/ Z8 @' ?! o! S8 \2 b2 z3 F
#View(month(date)) #查看现在日期中的月份
9 b9 {4 T% C( F- d% i" ~, mx1 <- array(1:nrow(data3),dim=c(nrow(data3),1))
2 F: J E$ c2 ]) n% ofor(i in c(1:nrow(data3)) ){* y' G- X# p; L7 r
if(nowmonth-data3[i,"birthmonth"]<0){* x( x- A( f9 [0 F0 N. y
x1[i,1] <- nowyear-data3[i,"birthyear"]-13 x$ E! e0 l- p1 c+ _ V! g
}else{ d2 R( o. ^7 D$ s5 n5 [
x1[i,1] <- nowyear-data3[i,"birthyear"]# c& w( W/ ?3 E8 m% A5 a/ e0 S6 C
}* }( N W7 E ~
}
& z* l) g$ B F8 S- z I#View(x1) #算出年龄x1,并加入到数据表中8 C9 x$ Y$ b3 S4 G+ x/ m) i
data4 <- cbind(data3,x1)
4 B6 e4 n/ i4 J+ ~View(data4) #加入x1年龄变量的新表展示
* n2 s9 C# g! c/ a1 h5 ^x2 <- data4$x2
! R2 e. e& O0 y9 LMean.x2 <- round(mean(x2),2)
3 n7 M& ^& S3 J, y$ PMin.x2 <- round(min(x2),2)
/ R. a" j" W7 k1 Y8 jMax.x2 <- round(max(x2),2)
' l) R4 G2 ~& M2 H; g2 l7 LMedian.x2 <- round(median(x2),2)
|3 z6 `6 C$ L K/ `5 T2 jSd.x2 <- round(sd(x2),2)
% {+ k% t9 {8 a! jcbind(Mean.x2,Min.x2,Max.x2,Median.x2,Sd.x2) #x2居住时间的相关结果1 f- j! b% O. j( C
Mean.x1 <- round(mean(x1),2)
J2 ^$ t' y) v# p( L0 H# FMin.x1 <- round(min(x1),2)# M4 V: R. R* ^- f! } `9 {7 |
Max.x1 <- round(max(x1),2)
- ?2 Y. _; o' Y, D& {8 v. OMedian.x1 <- round(median(x1),2)1 k" n9 o2 X/ l- S$ j
Sd.x1 <- round(sd(x1),2)" @0 Z# a8 l$ u1 N! ^8 A* G! F
cbind(Mean.x1,Min.x1,Max.x1,Median.x1,Sd.x1) #x1年龄的相关结果
: @1 ~2 \9 t7 r- e+ h7 i4 W! I" Ux3 <- data4$friends
: W; s! t( u+ V5 h3 p3 H1 K4 K) nMean.x3 <- round(mean(x3),2)
/ w3 E& X7 X1 ~) o5 V- r- dMin.x3 <- round(min(x3),2)/ }2 J7 N8 G3 A5 x$ n
Max.x3 <- round(max(x3),2)% r. r' |, G) P. C5 e" [) O
Median.x3 <- round(median(x3),2)
6 n/ e/ ?0 j' _: a; S5 I8 NSd.x3 <- round(sd(x3),2)
, a n& \: p2 v/ w& A; B Jcbind(Mean.x3,Min.x3,Max.x3,Median.x3,Sd.x3) #x3朋友数量的相关结果6 P. j, z4 g6 \& P: \. K
y <- data4$salary
; N4 ?3 f& c9 c2 t, C) ?Mean.y <- round(mean(y),2)* Y$ d) b) V$ L8 g% V/ x
Min.y <- round(min(y),2): L8 ?7 h. s2 i" d; K
Max.y <- round(max(y),2)# J4 w+ i# V9 q* B+ I
Median.y <- round(median(y),2)" _+ x0 C% c* N! K
Sd.y <- round(sd(y),2)
5 }. A9 y% L( ?) j. }- S& A8 Fcbind(Mean.y,Min.y,Max.y,Median.y,Sd.y) #因变量y的相关结果/ _( Z" G! q. O% g' ~1 |' I& H# M* j
7 K- v1 r) o+ W" R( h' N3 _
#6
* w0 `( E H! N* z/ J% l6 x#计算数据集中因变量和自变量的相关系数,要求保留2位小数。
W* t& o" `) f- y/ X3 g1 L: N1 Pround(cor(y,x1),2) #y和x1年龄! }( j; F: T* [: Q4 `3 |
round(cor(y,x2),2) #y和x2居住时间
1 w* s+ g$ U0 J' xround(cor(y,x3),2) #y和x3朋友数量
2 u2 V* ]% H. U* A# e! ]$ i9 \" H8 Y4 T% _0 y. E
#73 Y+ T- N( f: o& d7 X2 |- q% `
#分别绘制数据集中因变量与各个自变量的散点图
' R( V/ z- U- t; [4 H( J5 v# l3 `% spar(mfrow=c(1,3)) #布局,一行画3个图
" Y; m O" d& A3 X3 Rplot(x1,y,xlab="年龄x1",ylab="工资y")
& W" a0 |$ ~/ C+ j$ eplot(x2,y,xlab="居住时间x2",ylab="工资y")
' A& A. | s( S3 ~! xplot(x3,y,xlab="朋友数量x3",ylab="工资y")$ D6 R7 }4 a& z$ m! P1 B v
4 Y6 G: c, N4 p0 e. @#8
7 m1 a3 P! E& i% o1 ~- W# F#利用多元线性回归模型对数据集中因变量与自变量的关系进行拟合。& Y$ P! K9 @/ Q7 Z; U
lm.xy <- lm(y~x1+x2+x3)
: G |1 G1 j K; X3 O2 V8 e. Ilm.xy. p7 P( M* ]! S
summary(lm.xy) #得到的结果是方程是显著的具有线性关系,但是每一个系数不都是显著的/ ]3 d$ M7 ]+ q' Q$ |9 u
# V: p5 `. c7 I1 w#9
o+ i+ t9 ~) M#对#8中的多元线性回归模型进行诊断,确定异常值记录。
" V- R% S, F3 k" w# r, Hpar(mfrow = c(2,2)) #生成四种模型诊断的图形,2行2列. L* S$ Z) @1 }- ?, D
#生成四种模型诊断的图形:①残差与真实值的关系图 ②qq图用来检测其残差是否是正态分布
@4 I3 ?" ]3 c$ Y4 p- j#③用来检查等方差假设的。在一开始我们的五大假设第二条便是,我们假设预测的模型里方差是一个定值。
2 J( g8 |. \& }7 Y% `0 }- y' E#如果方差不是一个定值那么这个模型的可靠性也是大打折扣的。% F0 E4 p+ }' K4 }+ j, b
#④Leverage就是杠杆的意思。这种图的意义在于检查数据分析项目中是否有特别极端的点。
) i+ F, ]4 y, Fplot(lm)
' S0 ` k, E: j, y4 }- P Llibrary(carData) G2 x+ W/ k% X! b3 W8 r% e' s1 v0 M
library(car)# A. m+ y! T1 A0 v+ S }2 F
outlierTest(lm.xy) #显示离群点,Bonferroni校正,残差最大的点是136号点
- B1 T: I& w/ A# b
0 ]3 H/ J" C# M* O+ B0 _3 L1 K' W9 E( Y#10
5 w7 m5 l+ [& ~; P1 E" |#删除异常值记录后重新利用多元线性回归模型拟合数据。 W/ p( w0 ]2 ]9 n$ I
data4 <- data4[-136,] #删除该点
) g! J3 s2 }' q, D A% o1 lx1 <- data4$x15 H2 O, ?+ z5 \$ h' Z. p
x2 <- data4$x22 P L1 [4 U I, U/ e9 ]1 g% [5 y
x3 <- data4$friends0 b/ H7 b2 U; `6 H! T: a
y <- data4$salary
. }6 Q( K/ K' [5 X; ?lm.xy2 <- lm(y~x1+x2+x3) #重新拟合回归模型
. ?1 K1 s" L" Glm.xy2
9 S" X& \0 X2 V
7 [$ p: C5 W5 i4 W# v* ?) ]; x#11
5 D' ^2 s8 @) |3 |, Z#对#10中的多元线性回归模型进行多重共线性检验,若存在多重共线性,删除相关变量后重新进行拟合。
1 J* D& A8 W" `! x6 {( M& kvif(lm.xy2) #p判断多重共线性0<VIF<10(不存在)
/ ^( ^* b4 m; i' F2 ?' l6 i5 P6 {6 l: ?7 r; E; C
#129 g* @9 v7 \1 g8 i% G. y* b. l
#对#11中的结果进行解释,重点分析年龄、在北京的居住时间和朋友数量如何影响收入。3 Y2 D4 |; j+ h. U' Y* N/ c
summary(lm.xy2) #可知年龄和朋友数量对收入有影响,显著性*一颗星
( C' \& X7 N, J
* ?" V5 K; v! F e, X7 n**********************************************************************! `3 o* E* c% r. P6 D8 p1 b
+ c& h* `3 I& k二、利用多元线性回归模型预测收入
7 s' G% M9 |2 rView(data4) #124条数据
9 j: R1 I# S, l/ f" b#1* S$ U: |4 G" z$ h- v1 R
#从数据集中随机抽取50条记录作为预测集,剩下的数据作为训练集。
5 \4 z9 B* P* Ztrain0 <- sample(nrow(data4),nrow(data4)-50) #训练集和测试集
% }+ l o. t, M* b+ atrainData <- data4[train0,] #训练数据
^3 Q4 Z3 G- M/ ~ O" DtestData <- data4[-train0,] #测试数据& @' W/ C4 F! \
% {" j1 F( d9 i' z* G% H+ ~9 h#2
& r' Q$ [& \$ U#针对训练集,利用多元线性回归模型拟合数据。
3 r H) j/ H, @1 G' U e5 ^7 h* Z! wlm.xy3 <- lm(trainData[,"salary"]~trainData[,"x1"]+trainData[,"x2"]+trainData[,"friends"])
; L5 D I3 ]- W: c
" s' O) A, F1 s, y#3
3 N* O& H" H/ Y' V#对(2)中的多元线性回归模型进行诊断,处理异常值。
: W& D' {- q4 I6 }summary(lm.xy3)' T! V4 _" v$ [ |* @
par(mfrow=c(2,2))8 ]8 a) }) G" B$ g1 A
plot(lm.xy3)* |9 e8 u+ {0 A8 q8 m. S% A3 c4 e) X% F& a
outlierTest(lm.xy3)
, T$ _1 ]& ]2 e, [* v7 D$ ftrainData<-trainData[-c(150,32,82),] #删除异常值,随机的. \( z7 o5 j7 ]
' N( n6 q; r- s& f( ?
#46 U/ g2 t1 | w6 T% p" C9 J3 T
#对(3)中的多元线性模型进行多重共线性检验并加以处理。
& q5 r- k' o/ g6 B. M7 dvif(lm.xy3) #p判断多重共线性0<VIF<10(不存在)
) b" N8 ]- S1 c5 c5 c- jsalary<-trainData[,"salary"] #引入的数据是训练集的数据
7 t5 E7 a( F9 l) v: l" Zx2<-trainData[,"x2"]+ e& t0 K( {4 n2 o! b
x1<-trainData[,"x1"]6 W5 w+ W/ E1 ~- }' I
friends<-trainData[,"friends"]: U7 B3 ]. Y$ k+ \! w0 l! I
lm.xy3 <-lm(salary~x2+x1+friends)9 P" z" u! t p
5 Q* R# a$ C& ~2 u/ x#5, {( j2 H. r4 q# b z5 J# q# U" j! `
#针对(4)中的模型,分别利用AIC和BIC选择最优模型。
[! r/ y4 ]$ P& d5 O. M' e* F#AIC检验,赤池信息准则,选择最小的3 b) E5 s% w- V. ^ q" {
AIClm<-step(lm.xy3,direction="both")
8 t: P! |1 c, Q2 l- J" k7 a" E R#BIC检验,贝叶斯信息准则,选择最小的4 k: K: q( r. U0 Y4 ~3 F
BIClm<-step(lm.xy3,k=log(nrow(trainData)),direction="both")
4 ] W: R- F, f- m( ~
" k7 n2 H Q5 V9 \#62 Y6 t5 w1 X) Q m% W
#利用预测集进行预测,比较全模型(包含所有自变量)、AIC选择的最优模型、BIC选择的最优模型( x/ ]% A* D% k: g/ |" I& W
#这三个模型预测的准确性大小,并进行解释。
. F% L* V0 m0 t; q# u" kAllmodel<-predict(lm.xy3,testData)
H7 j5 }/ p, m8 IAICmodel<-predict(AIClm,testData)1 U! Z7 D0 E) y1 P
BICmodel<-predict(BIClm,testData)% A- {4 [- T8 Y6 G$ i) K% [& J0 _7 n
#均方误差检验,最小最优,分别计算全模型,AIC,BIC的均方误差$ o4 d! f% D4 I' F! {6 E
#均方根误差亦称标准误差,均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根5 ~' n+ z/ D( w* ?% Y1 w
#标准误差能够很好地反映出测量的精密度
+ s/ W! _4 p* u$ b' V' `: I; mMSE <- function(x){
+ x* r1 ~2 |( s$ W( B5 J: x mse <- sum((testData[,"salary"]-x)^2)/506 R L/ v8 \+ g" q. @. @) m+ U5 a
return(mse); J8 s. b) o% c
}
5 N# u; [! c4 F0 SMSE(AICmodel) #AIC/BIC/ALL是误差最小的
! K; Y( R3 I0 D; e; G& x/ iMSE(BICmodel)
9 x- U$ j7 t( O3 O' o( q, E" O# l' N9 cMSE(Allmodel)
2 W U& H. [, S: p$ `
* ?3 R$ s( Z; d+ j
$ z5 ^1 K; W% |5 Q9 V8 G! T3 @: n9 ~1 e1 y* n5 C# H! G. O
|
zan
|