作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] 用R做复线性回归方程分析
时间Thu Sep 5 17:48:31 2013
※ 引述《sseeaann (屌哥)》之铭言:
: 资料档我是载入套件faraway 用data(savings)资料档去分析
: 指令大部分都了解 但可能我回归观念不太好 有些步骤会搞混
: ex:像是离群值要常态假设前删除还是确定为常态假设再删除
: 或是删除变数该用stepwise或是用full model和reduced model的F分配来检定
: 这些步骤有点不知道用的时机点在哪里
: 有没有比较懂回归分析的大大可以稍微详述一下整套回归的步骤(利用此资料档)?
: 另外小弟我晚一点会在把我打的程式码PO上来 目前正在打当中^^
: → sseeaann:我在统计版也有发文 不过都没人回-.-
: → sseeaann:我现在比较想知道的是说 当整体模型检定出现两个以上变数
: → sseeaann:T值>0.05 不拒绝Ho 那是否可以直接剔除掉?
: → sseeaann:如果直接剔除 是要用哪个方法 偏F检定还是用stepwise Reg
你想要了解的部分就是regression analysis中
model checking 跟 model selection的部分
我就分这两个part来回答 一边附上我的程式做解说
library(faraway)
data(savings)
# Part I. Model checking
# 一般来说,model checking,主要就是error term的常态假设以及等变异假设的确认
# 另外,还有利用leverage or Cook's distance查看有没有outliers
# 在R里面有很方面的方式去做这三件事,程式如下:
lm.fit = lm(sr~pop75+pop15+dpi+ddpi, data=savings)
summary(lm.fit)
par(mfrow = c(2, 2), oma = c(0, 0, 2, 0))
plot(lm.fit)
# a. Normality Checking
# 右上角就是确认你的残差,通常就是直接看图片大概跟QQ-line (图中的broken line)
# 接近,大概我们都会认为error term符合常态假设,至於检定,就我的经验来说,
# 我实在不认为Goodness of fit检定有良好的Power.....
# 常见的检定像是:Shapiro-Wilk test of normality
# R当然有相对的程式如下:
shapiro.test(resid(lm.fit))
# H_0: Normality
# 或是你要自己画QQ plot,我这提供一个范本
library(lattice)
qqmath(~ res, data = data.frame(res=resid(lm.fit)), distribution = qnorm,
aspect="xy",prepanel = prepanel.qqmathline, panel = function(x, ...) {
panel.qqmathline(x, ...)
panel.qqmath(x, ...)
})
# b. Equal Variance
# 左上角的图就是用来check这个假设,一般来说,不要有特别的pattern
# 像是渐小,渐大,先小後大等等,或是有二次曲线出现等
# 通常就认为假设是OK的,我一样不喜欢等变异假设
# 一样提供R的等变异假设检定,在lmtest这个package里面有
library(lmtest)
gqtest(sr~pop75+pop15+dpi+ddpi, data=savings) # 未测试,直接google的
# equal variance图的其他画法
xyplot(res~fit, data=data.frame(res=resid(lm.fit), fit=fitted(lm.fit)))
# c. Outliers checking
# 通常就看右下角跟左下角两张图
# 左下角那张 通常不要超过sqrt(3)=1.732就可以了
# 右下角那张看leverage跟Cook's distance,但是至今我还是不太会看...
# 我记得我之前学到的是通常不要超过average leverage的0.7倍吧
# 不过R会自动帮你注记他认为有问题的点,机制我就不知道了
# 其他画法
xyplot(stdres~fit,data=data.frame(fit=fitted(lm.fit),stdres=rstandard(lm.fit)))
# d. others
# 独立性检定就很少再用,因为通常都只能检验特定期数,很少用
# R code如下:
library(car)
durbinWatsonTest(lm.fit)
# Part II. Model selection
# 这个part就很复杂了,因为还要牵扯到每一个应用层面的关系
# 通常不同的应用层面,有不同的选择标准以及方式
# 常见的有stepwise, backward, forward
# 标准有R^2, AIC, BIC, p-value等
# 通常先进行这个Part,才进行model checking的部分
# 我这里是因为它比较复杂先放在後面说
# 常见的code像是:
step(lm.fit)
step(lm.fit, direction="backward")
step(lm.fit, direction="forward")
library(MASS)
stepAIC(lm.fit)
# 共线性的检验
vif(lm.fit)
# 如果大於5,就是有共线性的存在
# 便要去确定covariate的correlation matrix
# 通常不建议有超过0.7相关系数的变数存在
# 其他解决方案则有 lasso 跟 ridge等方式
# 至於留存问题,通常根据你对资料的了解而决定
# 但是这个部分,真的不是我在这里可以说完的,我就不献丑了....
# 有错烦请指教,献丑了,谢谢
刚有google到下面两个网址,你可以去瞧瞧
http://www.statmethods.net/stats/regression.html
http://www.statmethods.net/stats/rdiagnostics.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.164.79.227
1F:推 diplazium:推c大的用心解说(原来可以用lattice画Q-Q plot啊~) 09/05 18:00
2F:→ celestialgod:为了弄出漂亮的东西 还有他比较方便 哈哈 09/05 18:04
3F:→ celestialgod:比较方便於画其他分配...qqplot这个function不爱用 09/05 18:09
4F:推 Wush978:推 09/05 19:50
5F:→ Wush978:Btw, 像这类文章,如果用knitr套件的Rmd写,排版会好很多 09/05 19:50
去用了一下,不过似乎无法编译中文,不论我的input是utf8 or chi-big5...
6F:→ celestialgod:谢谢版大建议QQ 09/05 21:48
7F:推 sseeaann:感谢c大的解说 对小弟非常有用 另外图上标记点是离群值? 09/05 21:55
8F:→ sseeaann:因为我做的图适用plot()指令和qqnorm()指令来做 不会特别 09/05 21:56
9F:→ sseeaann:标记离群值 得自己去找 能再请教c大模型的处理共线性指令 09/05 21:58
处理共线性最快的方法就是用 vif的指令 不知道在MASS还是car里面就有
※ 编辑: celestialgod 来自: 218.164.79.227 (09/05 22:14)
10F:推 sseeaann:好的 我会试试看^^ 09/05 22:23
11F:推 sseeaann:另外请教一下c大 预测和信赖区间的指令您知道怎麽表示吗? 09/05 23:40
# confidence interval for fitted value
predict(lm.fit, interval="confidence", level=0.95)
# confidence interval for prediction
pre.data = matrix(c(30,10,700,4,40,5,1000,2),2,,TRUE)
rownames(pre.data) = c("A_region", "B_region")
newdata=data.frame(pre.data)
names(newdata)=names(savings)[2:5]
predict(lm.fit, newdata=newdata ,interval="prediction", level=0.95)
# To ger more information by R>?predict.lm
12F:→ celestialgod:简单说明第二块,就是我创了两个地区的人口等变项 09/05 23:49
13F:→ celestialgod:predict要求新资料必须有一样的变数名称 09/05 23:49
14F:→ celestialgod:最後调整interval即是预测区间 09/05 23:50
# 此外,回归系数的信赖区间可由下列code获得
confint(lm.fit)
15F:推 sseeaann:请问一下 我发现var.test()指令好像也能得到95%信赖区间 09/06 00:00
16F:→ sseeaann:另外删除离群值的模型还是有可能常态假设不成立或 09/06 00:03
17F:→ sseeaann:等变异不相等? 假如删除前的模型常态假设和等变异相等 09/06 00:03
# 删除前後的不同,这我可能无法回答你
# 但是就我所学来说,删除离群值这件事真的很少做...
# 我是念纯统计的,我们老师通常都说资料最大
# 如果不是记录错误的话,通常都会纳入考量...
# 或是influence point才会考虑删除。
18F:→ sseeaann:另外真的感谢c大 帮了小弟很大的忙^^ 09/06 00:04
19F:推 Wush978:encoding issue 满烦的,我自己是用utf8编译都没问题 09/06 00:25
21F:→ celestialgod:windows下这个议题更麻烦XDDD 09/06 00:37
22F:推 sseeaann:c大有用过var.test()这指令求等变异吗? 还像也会跑出 09/06 00:50
23F:→ sseeaann:95%的信赖区间 请问这是哪个值的信赖区间@@? 09/06 00:51
variance ratio的信赖区间
我看了一下,那个只能用在category的covariate...
连续型的covariate不能用那个检验等变异....
※ 编辑: celestialgod 来自: 218.164.79.227 (09/06 01:15)
24F:推 sseeaann:了解 原来是我搞错了>< 09/06 02:27