作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] 用R做复线性回归方程分析
时间Fri Sep 6 02:01:36 2013
最後补一个总流程
1. 了解资料特性
2. 查看变数相关性,确保共线性问题不会出现
=> 出现共线性问题 就要考虑其他方法
3. 模型选择,通常不会是单一标准
a. 最简单的方式就是根据你设定的significant level筛选掉不显着的变数
b. 用prediction error决定加入哪些变数 (资工最常用)
c. 用AIC or BIC选择最好的模型
d. 有时候也会同时考虑R^2跟AIC
4. Model checking
a. Normality => 没过就要考虑response要做转换,很多时候b的方法会拿来用
b. Equal variance => 最常见的就是用power transformation or Box-Cox
(Note: 转换以容易解释为主)
c. outlier detection => influence大才建议删除
5. 最终结果
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.164.79.227
※ 编辑: celestialgod 来自: 218.164.79.227 (09/06 02:02)
1F:→ sseeaann:感谢c大 对我处理回归有很大的帮助^^ 09/06 02:29
2F:推 sseeaann:想再请教c大 假如资料含有NA 如何把NA排除或转化为0? 09/06 14:49
如果你的data存在dat这个object上,指令如下
dat[which(is.na(dat)]=0
3F:推 sseeaann:另外还有几个问题 outlierTest()指令是跑出所有离群值的? 09/06 15:23
他会告诉你说有没有standardized residual太大 在第一行
然後下面会列出最大的standardized residual....
我手边没有一个有outlier的data,不知道有outlier他会怎样....
4F:→ sseeaann:离群值要怎麽做删除? 指令我不太会..以savings资料档为例 09/06 15:25
离群值就你如果知道他的row number,rn 就 dat.new=data[-rn]
5F:推 sseeaann:我有把要删除na的资料档打进指令内 但好像还是不行 09/06 16:59
6F:→ sseeaann:删除NA的资料档我适用data(airquality) 09/06 16:59
sorry, 不用which
airquality[is.na(airquality)]=0
7F:→ sseeaann:我自己有找过删除NA的指令 好像有个na.action=na.exclude 09/06 17:00
8F:→ sseeaann:另外离群值的哪个指令 好像删除数字还可以 09/06 17:01
9F:→ sseeaann:但文字的离群值就不知道该怎麽删除了 09/06 17:01
你有例子我可以帮你试试看....
还有我对function涉猎比较少...通常我都徒法炼钢@@...
可能有好用的function可以用於删除NA or Outliers...
10F:推 sseeaann:另外诚心跟c大您说声感恩 不然回归很少有用R的书籍= =+ 09/06 17:06
书的话下面有几本 你可以在网路上找到低调
Linear Models with R
Extending_the_Linear_Model_with_R
Using R for Data Management, Statistical Analysis, and Graphics
这几本都有用回归作分析....而且都是用R
11F:推 sseeaann:关於文字的离群值我适用data(savings)资料档 再用指令 09/06 18:24
12F:→ sseeaann:outlierTest()找出离群值 只是试跑出文字的离群值用 09/06 18:25
13F:→ sseeaann:data[-rn,]的方式不适能删除 数字的话就没问题! 09/06 18:26
14F:推 sseeaann:另外刚刚有把airquality[is.na(airquality)]=0的指令放在 09/06 18:34
15F:→ sseeaann:lm()指令中 但发现如果对y做log转换好像就有问题= =+ 09/06 18:34
还是不太明白什麽叫做文字离群值XD...
rn一定要数字啊!!! 因为那个是去掉那一列
如果你说的是去掉某一个国家的话,可以这样
savings[-match("South Africa", rownames(savings)),]
这个就是我要去掉南非那一个row....当然可以一次去多个
savings[-match(c("South Africa","China"), rownames(savings)),]
因为你y里面有0....(PS:你刚刚说要把NA转成0....)
所以log(0)=-Inf...当然会有问题
补充:你可能会用到多项式的回归
可以这样写 lm(y~I(x^2)+I(x^3)+log(x))
I()可以让你在lm里面做计算@@...
16F:推 sseeaann:喔喔 对吼 不能LOG(0)= =+ 那NA的部分要怎麽处理才好= =? 09/06 19:30
17F:→ sseeaann:因为有个回归方程的常态假设没成立 所以我要对Y做LOG转换 09/06 19:31
18F:→ sseeaann:麻烦的是airquality这个资料档有NA.. 09/06 19:31
19F:→ sseeaann:晚一点我可能会PO我写的程式码@@ 不过应该有些问题.. 09/06 19:33
NA就是NA阿= = 给他0....实在不怎麽make sense除非有什麽合理解释...
你PO程式码之後 可以再研究看看
※ 编辑: celestialgod 来自: 218.164.79.227 (09/06 19:41)
看了一下你的程式....
最後一行我前面有说明
还有 var.test 我不懂你在做什麽...
你可以说明一下 你那样分组的意义跟原因吗?
21F:→ sseeaann:另外我会想处理有NA是因为如果不管的话 分析一些数据 09/07 00:11
22F:→ sseeaann:程式好像会自动忽略有NA的整笔资料 所以想说能把NA调为0? 09/07 00:12
23F:→ sseeaann:因为这方面小弟是也还是新手 满多地方都一知半解= =+ 09/07 00:13
忽略是正常的...
如果不想忽略 请找其他适合的模型配适
或是利用一些方法去估计
不是你随便加值 可以搞定的...
资料最大!!! 你想对资料做什麽都要有合理理由!!
24F:→ sseeaann:另外关於影响点的检测 c大适用哪个指令来做检测? 09/07 00:16
影响点通常就是去画scatter plot比较快
看图真的比较容易~"~
25F:→ sseeaann:另外是否能从cook's distance plot看出影响点? 09/07 00:40
不可能XD 我指的影响点是说会严重影响回归系数估计的点
有些点虽然有点超出正常群的范围 可是他在回归线上 那是可以的...
=> cook's distance plot不能正确找出影响点,但是可以缩小范围
26F:→ sseeaann:var.test()指令是我们被规定要拿来检测变异数为常数 所以 09/07 00:41
规定= =? 不太懂这个规定有何用,不能用就是不能用...没什麽好说的
而且那个是做two-sample variance F-test 完全不适用於此...
27F:→ sseeaann:我不太敢用别的检定= = 只有常态假设检定这边跟C大一样 09/07 00:42
另外,我前面提过检定大多参考,统计的人比较爱看图
28F:→ sseeaann:贴的程式码我说明比较少一点 急着贴程式码= =+ 09/07 00:43
说明少倒还好啦...可以接受...
29F:→ sseeaann:程式码我友在做伊些修改 请C大再一下^^ 09/07 00:52
30F:→ sseeaann:另外scatterplot指令我刚刚有试过 会跑出错误 09/07 00:54
31F:→ sseeaann:"figure margins too large"这个错误 09/07 00:55
指令是plot 然後就response对每一个x画
par(mfrow = c(2, 2), oma = c(0, 0, 2, 0))
plot(c(min(,2:5),max(savings[,2:5])),c(min(savings$sr),max(savings$sr)),type="n")
for(i in 1:4) matplot(savings$sr, savings[,i+1],add=T)
32F:→ sseeaann:另外友在C大给的网站看到这个指令influencePlot() 09/07 00:59
我说的influence point跟那个是两回事...
influence相关的概念 你可以google..
33F:→ sseeaann:上面哪个plot的指令我好像跑不出来 会有错误@@ 09/07 01:03
library(car)
influencePlot(lm.fit) # 正常 他说有两个影响点
34F:→ sseeaann:跟C大这样讨论後 真的发现还是太多东西一知半解 如果C大 09/07 01:32
35F:→ sseeaann:有空的话 能不能就savings此资料做一个复线性回归得最适 09/07 01:33
36F:→ sseeaann:模型给小弟做一个参考? 09/07 01:33
我最近还有事情要忙,这就没法了,一个个小问题还可以...
37F:→ sseeaann:C大请教一下 影响点删除後的模型也有可能不通过常态假设? 09/07 13:21
38F:→ sseeaann:另外删除影响点是全部删除的跟一个个删除的模型都要检定? 09/07 13:22
我不想再强调一次了QQ
影响点的删除 你必须要有合理理由
通常就是画图去做判定 没有其他捷径
39F:→ sseeaann:还有之前有跟您讨论var.test()这指令说是我用法错误 09/07 13:23
是的,用法是错误的
40F:→ sseeaann:那以savings来说 要用哪个指令检测等变异?除了看图表外@@ 09/07 13:23
我前面就用过了 gqtest
看图还是最常用的
不会看图只看检定...有点本末倒置
检定的power说真的不强...太多assumption
41F:→ sseeaann:另外C大您有说过离群值是参考用?主要是看影响点? 09/07 13:25
对 是看该点是否有严重影响斜率
42F:→ sseeaann:另外可以麻烦C大提几个重要的指标但我PO的程式码却没有? 09/07 13:27
程式码,我就不看了...我前面那篇写的已经够完整了....
43F:→ sseeaann:再次感谢C大鼎力相助^^ 09/07 13:27
46F:推 Wush978:请问你做这个分析的目的是? 09/07 18:05
47F:→ Wush978:阿,我是想请s版友先想想这个问题,因为不同的目的手段也 09/07 21:59
48F:→ Wush978:会不同,所以这个问题是非常重要的。 09/07 21:59
版大说得很对QQ...不同领域处理相关问题的看法是极为不同的。
49F:→ sseeaann:拍谢 晚上有事 刚刚才回来= =+ 主要是要找到一个最适模型 09/08 00:47
50F:→ sseeaann:经过塞选变数->检定变异数为常数->常态假设是否成立-> 09/08 00:49
51F:→ sseeaann:塞选掉对模型有影响的离群值 最後出来的最适模型即可 09/08 00:50
52F:→ sseeaann:这是我们教授要我们照的步骤 可是是暑修 所以教得很随便. 09/08 00:51
53F:→ sseeaann:只是告诉我们一些指令 讲些观念再来就是叫我们自己练习.. 09/08 00:51
最适怎样叫做最适....
资工觉得Prediction Error or Test Error最低是最适
统计有些人认为AIC最低最适 有些人认为BIC最低最适
当然亦有人认为判定系数最高就最适 何谓最适?
这没有一个准则...只能说你们教授教的就照教科书念一念而已吧~"~
54F:→ sseeaann:所以才会很多观念以及程式都一知半解 真的不好意思>< 09/08 00:54
这不完全是你的错@@...
55F:→ sseeaann:是阿 我现在其实比较烦的就是离群值的部分>< 09/08 01:06
56F:→ sseeaann:教授只教outlierTest()这指令说跑出来的离群值要删除= =+ 09/08 01:07
57F:→ sseeaann:但我发现这样问题满多的.因为我隐约记得离群值事不能乱删 09/08 01:08
58F:→ sseeaann:总之有些地方还是得照他的规定来做 所以就只好尽量了>< 09/08 01:09
59F:→ sseeaann:就希望尽量在删除离群值後 模型能保持常态假设和等变异 09/08 01:14
60F:→ sseeaann:至少有达成教授他要求的方式和结果 自己有时间再钻研吧 09/08 01:15
恩 按照你教授的想法 大概资料会只剩下70%...这种事情常有XD
会不断的删....我以前就用过这种作业了XDDD
61F:→ Wush978:sseeaann,那模型的目的是什麽呢?不同目的,所选的模型差 09/08 01:47
62F:→ Wush978:异也会很大 09/08 01:47
63F:→ Wush978:就像是预测用模型,不一定会很注重共线性的问题 09/08 01:48
那是经济资料,我觉得选择模型最重要的应该是预测未来的saving rate
64F:→ sseeaann:其实如果真要问我这个模型的目的是做啥 我也不太会说... 09/08 02:10
65F:→ sseeaann:暑修这样上根本没办法搞懂回归 只能照教授的要求尽量做 09/08 02:11
66F:→ sseeaann:不过我想模型的用途应该像W大讲的 预测用吧.. 09/08 02:13
67F:→ sseeaann:而且我很难责怪教授教不好 肯开回归暑修就应该要很感激了 09/08 02:15
只能说 回归分析是需要经验来累积的....
不是上个课就会了...教授教得好不好是一回事
你有没有认真学起来才是真的
※ 编辑: celestialgod 来自: 218.164.166.108 (09/08 02:21)
68F:→ sseeaann:目前已经弄好了 不过看完真的有头大 因为不熟回归.. 09/08 18:05
69F:→ sseeaann:讲一下我的步骤好了 分析资料建模->model selection-> 09/08 18:05
70F:→ sseeaann:偏F检定->检查共线性->残差配适图->变异数是否为常数-> 09/08 18:08
71F:→ sseeaann:QQplot->常态假设检定->离群值检定->删离群值之模型检定 09/08 18:09
72F:→ sseeaann:->回到残差配适图的步骤到常态假设检定->得到最适模型 09/08 18:10
73F:→ sseeaann:抱歉 中间有少打一开始的常态假设没过则做对数转换 09/08 18:11