Stata: 處理Missing Value

不管是什麼樣的資料庫,一定都會有 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。

1.png

如果想要確認一下,你可以tab一下看happy這個變數的分佈:

tab happy, missing
你會看到happy下面有幾個.d, .n,這些就是造成if happy!=0 這個語法不能完全排除happy的missing value。

2.png

所以最好的方式,就是像之前所說的,用!mi(happy)這種方式較為理想。下次再介紹其它處理missing values的技巧。

18 thoughts on “Stata: 處理Missing Value”

  1. 可不可以再說詳細一點呢!你的意思是STATA處理遺漏值的方式就是在跑統計分析時用語法的方式將這些遺漏值全部刪除!!
    還有別的方式嗎??
    我在跑描述統計時用你的方式跑!可是跑不出來呢!
    不好意思
    我是STATA的初學者
    麻煩您了

  2. Hi 小燕燕~

    Stata處理missing value的方式是有的才留著。舉例來說,如果你的第一個regression有三個變數,那三個變數都有值才會留著。如果第二個regression有五個變數,那五個變數都有值才會留著。這樣造成的問題就是你跑很多regression時,你的樣本數會愈來愈少,所以在跑第一個regression時才要限制樣本要五個變數都有才行。

    還有其它方法像是multiple imputation,但不適合初學者。

    如果你的敘述統計跑不出來,有沒有錯誤訊息呢?語法可以貼來看一下嗎?

  3. Dear Lin

    非常感謝你的回答喔!我還以為會石沈大海呢
    我想我應該懂你的意思!不過我其實是想知道怎麼去把遺漏值找出來然後刪除!我學弟教我用list edu if edu == .這樣的方式!!
    所以我試了,可以跑出來,就找到哪幾筆資料是遺漏把它刪除,應該是最簡單的方式吧!我因為用習慣了SPSS!對語法的東西非常的不行!!
    另外我可不可以請問在Stata中
    畫出盒形圖之後
    我要怎麼它顯示
    哪幾筆資料是偏離值啊!!
    還有statistica你熟嗎?
    也是畫出盒形圖之後都不會顯示
    哪幾筆是偏離值啊!!

  4. 還有還有
    可以在問一個問題嗎?
    就是啊
    我要用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要怎麼處理遺漏值啊!
    就是像我說的
    如何找出哪幾筆是遺漏值?
    然後如何刪除

    謝謝你喔
    不好意思耶

  5. stata要刪除的作法,應該是drop if income >. 如果用drop if income ==.怕會出現的問題是資料裡的missing value的值是.n或.d之類的,可能會沒刪到。

    畫盒型圖我不太熟,要晚點有空再來玩玩看。statistica我不會,很抱歉。

    至於SAS,我現在電腦沒有,要等八月初我回學校之後才能試試正確的語法。不過看你出現的錯誤訊息,應該是先sort你要畫圖的變數才對,然後才能畫圖。

  6. 不好意思,那我想請問一下,在SPSS中,處理遺漏值時,我想讓遺漏題數小於2題的人,用平均數去補遺漏值,大於2題則不補,保留原本有遺漏值的樣子(不刪除這些樣本,因為這些樣本在其他變項上可能是有效樣本..)該如何做呢?

    不知道我這樣描述清不清楚…

    謝謝你! ^^

  7. 您好,我想請問一個multiple imputation的問題。例如有三個model,都是用內建的listwise deletion處理,但是我擔心會有missingvalues的問題(mod1 約50% missing,mod2 and mod3都大概只有1/4),但是我用MI之後,結果並沒有顯著的不同,包括missingvalue最嚴重的mod1,然而我最後的result report,仍然必須要用MI的模型來報嗎?還是MI在這種情況下,可當一個robust check即可,既然沒有顯著的差異,那麼用原來忠實呈現data的模型會比較好?

  8. 您好
    我將excel載入stata軟體中
    但因資料尚須做一些處理方為最後跑迴歸的資料
    我想透過stata的指令,將某一欄(ticker)有遺漏值的
    樣本直接從原檔案刪除,存為原檔
    我的程式碼為
    preserve
    drop if ticker>.
    但一直失敗…
    不曉得我應該怎麼做才對

    真的很謝謝你^^

  9. 請問,
    在處理missing data時,我把他key 成 .
    但跑資料 如cc 或是 logistic regression 時 他無法辨識為missing data…
    到底現在stata 12版中,missing data 要key 成怎樣的字呢 ??
    thanks ^^

  10. 請問我現在的dataset將遺漏值分為9999991~9999999我要tab每個變項,看裡面又什麼遺漏值一個一個變項刪嗎?(drop if var2==9999999)還是有其他的方法呢?

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top
Verified by MonsterInsights