不管是什麼樣的資料庫,一定都會有 missing value。處理missing value最常見的方式就是listwise deletion,就是所有值都有的才保留,不符合的就刪掉。當然,處理missing value還有其它方式,像是multiple imputation,不過這不在今天討論的範圍,今天只講listwise deletion,以及該怎麼在stata裡面處理。
Stata version 7及之前版本,missing value只有一個值,就是 . (英文句點的那個點)。所以在早期的code,如果要排除missing value,做法通常是下if variable !=.
不過,這樣的指令到了version 8以後的版本,就不正確了! 因為第八版開始,missing value有了較多選擇,共同的特色是這些值都是從 . 開始的,如.a, .b, .k, 到.z等。換言之,舊的作法在很多情況下很容易出現問題。
regress a b if c!=. & d!=.
regress a b c if d!=.
regress a b c d
在第一行的程式裡,其實這會不小心將c這個變數為.b, .c等其它亦為missing value的值包含進去,所以如果要整個regression的observation number都一樣的話,就不能再用這種作法。應該選擇的方式是 if c <. 或是if !mi(c) 這兩種作法。
不信嗎?那拿之前(Kuso)性伴侶人數研究的案例來分析好了。之前寫的regression的程式如下:
regress dpartners dmale age dblack dother dincome if (dwidowed!=.) & (ddivorced!=.) & (dseparated!=.) & (dnevermarried!=.)& (happy<.) & (dlangcom!=.)
跑出來是1033個人。不過你應該注意到裡面有一個值 happy我是用 <.,如果改回happy!=.的話,會發生什麼事呢?
regress dpartners dmale age dblack dother dincome if (dwidowed!=.) & (ddivorced!=.) & (dseparated!=.) & (dnevermarried!=.)& (happy!=.) & (dlangcom!=.)
你會注意到結果像下圖一樣,number of obs.變成了1041。
如果想要確認一下,你可以tab一下看happy這個變數的分佈:
tab happy, missing
你會看到happy下面有幾個.d, .n,這些就是造成if happy!=0 這個語法不能完全排除happy的missing value。
所以最好的方式,就是像之前所說的,用!mi(happy)這種方式較為理想。下次再介紹其它處理missing values的技巧。
可不可以再說詳細一點呢!你的意思是STATA處理遺漏值的方式就是在跑統計分析時用語法的方式將這些遺漏值全部刪除!!
還有別的方式嗎??
我在跑描述統計時用你的方式跑!可是跑不出來呢!
不好意思
我是STATA的初學者
麻煩您了
Hi 小燕燕~
Stata處理missing value的方式是有的才留著。舉例來說,如果你的第一個regression有三個變數,那三個變數都有值才會留著。如果第二個regression有五個變數,那五個變數都有值才會留著。這樣造成的問題就是你跑很多regression時,你的樣本數會愈來愈少,所以在跑第一個regression時才要限制樣本要五個變數都有才行。
還有其它方法像是multiple imputation,但不適合初學者。
如果你的敘述統計跑不出來,有沒有錯誤訊息呢?語法可以貼來看一下嗎?
Dear Lin
非常感謝你的回答喔!我還以為會石沈大海呢
我想我應該懂你的意思!不過我其實是想知道怎麼去把遺漏值找出來然後刪除!我學弟教我用list edu if edu == .這樣的方式!!
所以我試了,可以跑出來,就找到哪幾筆資料是遺漏把它刪除,應該是最簡單的方式吧!我因為用習慣了SPSS!對語法的東西非常的不行!!
另外我可不可以請問在Stata中
畫出盒形圖之後
我要怎麼它顯示
哪幾筆資料是偏離值啊!!
還有statistica你熟嗎?
也是畫出盒形圖之後都不會顯示
哪幾筆是偏離值啊!!
還有還有
可以在問一個問題嗎?
就是啊
我要用SAS畫盒形圖
可是一直畫不出來耶
可以幫我看一下嗎??
這是語法
PROC BOXPLOT DATA="C:SASfilecreate1b";
plot age* type;
Run;
這是錯誤訊息
1 PROC BOXPLOT DATA="C:SASfilecreate1b";
2 plot age* type;
3 Run;
NOTE: Writing HTML Body file: sashtml.htm
NOTE: Processing beginning for PLOT statement number 1.
ERROR: The values of the group variable type are not sorted in increasing order in the data set
CREATE1B.
NOTE: Recommended practice is to sort the data by the group variable (within BY groups if any)
with PROC SORT.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: There were 21 observations read from the data set C:SASfilecreate1b.
NOTE: PROCEDURE BOXPLOT used (Total process time):
real time 1.73 seconds
cpu time 0.18 seconds
另外喔
SAS要怎麼處理遺漏值啊!
就是像我說的
如何找出哪幾筆是遺漏值?
然後如何刪除
謝謝你喔
不好意思耶
stata要刪除的作法,應該是drop if income >. 如果用drop if income ==.怕會出現的問題是資料裡的missing value的值是.n或.d之類的,可能會沒刪到。
畫盒型圖我不太熟,要晚點有空再來玩玩看。statistica我不會,很抱歉。
至於SAS,我現在電腦沒有,要等八月初我回學校之後才能試試正確的語法。不過看你出現的錯誤訊息,應該是先sort你要畫圖的變數才對,然後才能畫圖。
謝謝你的回答
希望將來還有機會與你討論囉
這是我的msn
evababy0622@hotmail.com
方便的話可以加入我
這樣討論較即時…….
不好意思,那我想請問一下,在SPSS中,處理遺漏值時,我想讓遺漏題數小於2題的人,用平均數去補遺漏值,大於2題則不補,保留原本有遺漏值的樣子(不刪除這些樣本,因為這些樣本在其他變項上可能是有效樣本..)該如何做呢?
不知道我這樣描述清不清楚…
謝謝你! ^^
您好 可以請問一下 當資料是panel data時 設定missing valu 也是與一般data相同方法嗎?
@琬渝,
panel data 比較麻煩,要看你是long format 還是 wide format。不過為什麼不用multiple imputation呢?
@miigis,
SPSS 可以在 transform 的時候設定condition,加入 if的條件,應該就可以了。
您好,我想請問一個multiple imputation的問題。例如有三個model,都是用內建的listwise deletion處理,但是我擔心會有missingvalues的問題(mod1 約50% missing,mod2 and mod3都大概只有1/4),但是我用MI之後,結果並沒有顯著的不同,包括missingvalue最嚴重的mod1,然而我最後的result report,仍然必須要用MI的模型來報嗎?還是MI在這種情況下,可當一個robust check即可,既然沒有顯著的差異,那麼用原來忠實呈現data的模型會比較好?
您好
我將excel載入stata軟體中
但因資料尚須做一些處理方為最後跑迴歸的資料
我想透過stata的指令,將某一欄(ticker)有遺漏值的
樣本直接從原檔案刪除,存為原檔
我的程式碼為
preserve
drop if ticker>.
但一直失敗…
不曉得我應該怎麼做才對
真的很謝謝你^^
.表示無限大,所以不能再大於無限大了
應該寫drop if mi(ticker)
請問,
在處理missing data時,我把他key 成 .
但跑資料 如cc 或是 logistic regression 時 他無法辨識為missing data…
到底現在stata 12版中,missing data 要key 成怎樣的字呢 ??
thanks ^^
@佩琪 高,
變數型態要是數字才行。
請問我現在的dataset將遺漏值分為9999991~9999999我要tab每個變項,看裡面又什麼遺漏值一個一個變項刪嗎?(drop if var2==9999999)還是有其他的方法呢?
@Evangelina Huang,
看有沒有codebook,你可以一起改
善用foreach指令加上if,應該就可以了
所以指令是 ? foreach if 9999991/9999999,不好意思不太懂您的意思。