作者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)
→ sseeaann:感謝c大 對我處理迴歸有很大的幫助^^ 09/06 02:29
推 sseeaann:想再請教c大 假如資料含有NA 如何把NA排除或轉化為0? 09/06 14:49
如果你的data存在dat這個object上,指令如下
dat[which(is.na(dat)]=0
推 sseeaann:另外還有幾個問題 outlierTest()指令是跑出所有離群值的? 09/06 15:23
他會告訴你說有沒有standardized residual太大 在第一行
然後下面會列出最大的standardized residual....
我手邊沒有一個有outlier的data,不知道有outlier他會怎樣....
→ sseeaann:離群值要怎麼做刪除? 指令我不太會..以savings資料檔為例 09/06 15:25
離群值就你如果知道他的row number,rn 就 dat.new=data[-rn]
推 sseeaann:我有把要刪除na的資料檔打進指令內 但好像還是不行 09/06 16:59
→ sseeaann:刪除NA的資料檔我適用data(airquality) 09/06 16:59
sorry, 不用which
airquality[is.na(airquality)]=0
→ sseeaann:我自己有找過刪除NA的指令 好像有個na.action=na.exclude 09/06 17:00
→ sseeaann:另外離群值的哪個指令 好像刪除數字還可以 09/06 17:01
→ sseeaann:但文字的離群值就不知道該怎麼刪除了 09/06 17:01
你有例子我可以幫你試試看....
還有我對function涉獵比較少...通常我都徒法煉鋼@@...
可能有好用的function可以用於刪除NA or Outliers...
推 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
推 sseeaann:關於文字的離群值我適用data(savings)資料檔 再用指令 09/06 18:24
→ sseeaann:outlierTest()找出離群值 只是試跑出文字的離群值用 09/06 18:25
→ sseeaann:data[-rn,]的方式不適能刪除 數字的話就沒問題! 09/06 18:26
推 sseeaann:另外剛剛有把airquality[is.na(airquality)]=0的指令放在 09/06 18:34
→ 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裡面做計算@@...
推 sseeaann:喔喔 對吼 不能LOG(0)= =+ 那NA的部分要怎麼處理才好= =? 09/06 19:30
→ sseeaann:因為有個迴歸方程的常態假設沒成立 所以我要對Y做LOG轉換 09/06 19:31
→ sseeaann:麻煩的是airquality這個資料檔有NA.. 09/06 19:31
→ sseeaann:晚一點我可能會PO我寫的程式碼@@ 不過應該有些問題.. 09/06 19:33
NA就是NA阿= = 給他0....實在不怎麼make sense除非有什麼合理解釋...
你PO程式碼之後 可以再研究看看
※ 編輯: celestialgod 來自: 218.164.79.227 (09/06 19:41)
看了一下你的程式....
最後一行我前面有說明
還有 var.test 我不懂你在做什麼...
你可以說明一下 你那樣分組的意義跟原因嗎?
→ sseeaann:另外我會想處理有NA是因為如果不管的話 分析一些數據 09/07 00:11
→ sseeaann:程式好像會自動忽略有NA的整筆資料 所以想說能把NA調為0? 09/07 00:12
→ sseeaann:因為這方面小弟是也還是新手 滿多地方都一知半解= =+ 09/07 00:13
忽略是正常的...
如果不想忽略 請找其他適合的模型配適
或是利用一些方法去估計
不是你隨便加值 可以搞定的...
資料最大!!! 你想對資料做什麼都要有合理理由!!
→ sseeaann:另外關於影響點的檢測 c大適用哪個指令來做檢測? 09/07 00:16
影響點通常就是去畫scatter plot比較快
看圖真的比較容易~"~
→ sseeaann:另外是否能從cook's distance plot看出影響點? 09/07 00:40
不可能XD 我指的影響點是說會嚴重影響回歸係數估計的點
有些點雖然有點超出正常群的範圍 可是他在回歸線上 那是可以的...
=> cook's distance plot不能正確找出影響點,但是可以縮小範圍
→ sseeaann:var.test()指令是我們被規定要拿來檢測變異數為常數 所以 09/07 00:41
規定= =? 不太懂這個規定有何用,不能用就是不能用...沒什麼好說的
而且那個是做two-sample variance F-test 完全不適用於此...
→ sseeaann:我不太敢用別的檢定= = 只有常態假設檢定這邊跟C大一樣 09/07 00:42
另外,我前面提過檢定大多參考,統計的人比較愛看圖
→ sseeaann:貼的程式碼我說明比較少一點 急著貼程式碼= =+ 09/07 00:43
說明少倒還好啦...可以接受...
→ sseeaann:程式碼我友在做伊些修改 請C大再一下^^ 09/07 00:52
→ sseeaann:另外scatterplot指令我剛剛有試過 會跑出錯誤 09/07 00:54
→ 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)
→ sseeaann:另外友在C大給的網站看到這個指令influencePlot() 09/07 00:59
我說的influence point跟那個是兩回事...
influence相關的概念 你可以google..
→ sseeaann:上面哪個plot的指令我好像跑不出來 會有錯誤@@ 09/07 01:03
library(car)
influencePlot(lm.fit) # 正常 他說有兩個影響點
→ sseeaann:跟C大這樣討論後 真的發現還是太多東西一知半解 如果C大 09/07 01:32
→ sseeaann:有空的話 能不能就savings此資料做一個複線性迴歸得最適 09/07 01:33
→ sseeaann:模型給小弟做一個參考? 09/07 01:33
我最近還有事情要忙,這就沒法了,一個個小問題還可以...
→ sseeaann:C大請教一下 影響點刪除後的模型也有可能不通過常態假設? 09/07 13:21
→ sseeaann:另外刪除影響點是全部刪除的跟一個個刪除的模型都要檢定? 09/07 13:22
我不想再強調一次了QQ
影響點的刪除 你必須要有合理理由
通常就是畫圖去做判定 沒有其他捷徑
→ sseeaann:還有之前有跟您討論var.test()這指令說是我用法錯誤 09/07 13:23
是的,用法是錯誤的
→ sseeaann:那以savings來說 要用哪個指令檢測等變異?除了看圖表外@@ 09/07 13:23
我前面就用過了 gqtest
看圖還是最常用的
不會看圖只看檢定...有點本末倒置
檢定的power說真的不強...太多assumption
→ sseeaann:另外C大您有說過離群值是參考用?主要是看影響點? 09/07 13:25
對 是看該點是否有嚴重影響斜率
→ sseeaann:另外可以麻煩C大提幾個重要的指標但我PO的程式碼卻沒有? 09/07 13:27
程式碼,我就不看了...我前面那篇寫的已經夠完整了....
→ sseeaann:再次感謝C大鼎力相助^^ 09/07 13:27
推 Wush978:請問你做這個分析的目的是? 09/07 18:05
→ Wush978:阿,我是想請s版友先想想這個問題,因為不同的目的手段也 09/07 21:59
→ Wush978:會不同,所以這個問題是非常重要的。 09/07 21:59
版大說得很對QQ...不同領域處理相關問題的看法是極為不同的。
→ sseeaann:拍謝 晚上有事 剛剛才回來= =+ 主要是要找到一個最適模型 09/08 00:47
→ sseeaann:經過塞選變數->檢定變異數為常數->常態假設是否成立-> 09/08 00:49
→ sseeaann:塞選掉對模型有影響的離群值 最後出來的最適模型即可 09/08 00:50
→ sseeaann:這是我們教授要我們照的步驟 可是是暑修 所以教得很隨便. 09/08 00:51
→ sseeaann:只是告訴我們一些指令 講些觀念再來就是叫我們自己練習.. 09/08 00:51
最適怎樣叫做最適....
資工覺得Prediction Error or Test Error最低是最適
統計有些人認為AIC最低最適 有些人認為BIC最低最適
當然亦有人認為判定係數最高就最適 何謂最適?
這沒有一個準則...只能說你們教授教的就照教科書念一念而已吧~"~
→ sseeaann:所以才會很多觀念以及程式都一知半解 真的不好意思>< 09/08 00:54
這不完全是你的錯@@...
→ sseeaann:是阿 我現在其實比較煩的就是離群值的部分>< 09/08 01:06
→ sseeaann:教授只教outlierTest()這指令說跑出來的離群值要刪除= =+ 09/08 01:07
→ sseeaann:但我發現這樣問題滿多的.因為我隱約記得離群值事不能亂刪 09/08 01:08
→ sseeaann:總之有些地方還是得照他的規定來做 所以就只好盡量了>< 09/08 01:09
→ sseeaann:就希望盡量在刪除離群值後 模型能保持常態假設和等變異 09/08 01:14
→ sseeaann:至少有達成教授他要求的方式和結果 自己有時間再鑽研吧 09/08 01:15
恩 按照你教授的想法 大概資料會只剩下70%...這種事情常有XD
會不斷的刪....我以前就用過這種作業了XDDD
→ Wush978:sseeaann,那模型的目的是什麼呢?不同目的,所選的模型差 09/08 01:47
→ Wush978:異也會很大 09/08 01:47
→ Wush978:就像是預測用模型,不一定會很注重共線性的問題 09/08 01:48
那是經濟資料,我覺得選擇模型最重要的應該是預測未來的saving rate
→ sseeaann:其實如果真要問我這個模型的目的是做啥 我也不太會說... 09/08 02:10
→ sseeaann:暑修這樣上根本沒辦法搞懂迴歸 只能照教授的要求盡量做 09/08 02:11
→ sseeaann:不過我想模型的用途應該像W大講的 預測用吧.. 09/08 02:13
→ sseeaann:而且我很難責怪教授教不好 肯開迴歸暑修就應該要很感激了 09/08 02:15
只能說 迴歸分析是需要經驗來累積的....
不是上個課就會了...教授教得好不好是一回事
你有沒有認真學起來才是真的
※ 編輯: celestialgod 來自: 218.164.166.108 (09/08 02:21)
→ sseeaann:目前已經弄好了 不過看完真的有頭大 因為不熟迴歸.. 09/08 18:05
→ sseeaann:講一下我的步驟好了 分析資料建模->model selection-> 09/08 18:05
→ sseeaann:偏F檢定->檢查共線性->殘差配適圖->變異數是否為常數-> 09/08 18:08
→ sseeaann:QQplot->常態假設檢定->離群值檢定->刪離群值之模型檢定 09/08 18:09
→ sseeaann:->回到殘差配適圖的步驟到常態假設檢定->得到最適模型 09/08 18:10
→ sseeaann:抱歉 中間有少打一開始的常態假設沒過則做對數轉換 09/08 18:11