2012年9月10日 星期一

Stata: 加總同性質的資料(Aggregate similar Observations) ~2

以前寫過一篇:Stata: 加總同性質的資料(Aggregate similar Observations),裡面用的方法是collapse,這種情況用於:一個人有多筆資料 (用術語說,就是資料格式是長格式),你想要加總同性質資料,將每個人的資料變成一筆。

這種方法雖好,但如果你想要維持資料是長格式 (一個人有多筆資料),那collapse就不符合你的需求。

假設資料格式如下圖所示。sid代表student id,did代表文件 id,words代表每個文件的字數。

stata aggregate 1

如果用 collpase 指令:

collapse (mean) words, by(sid)

結果會如下圖所示。原本一個學生有多筆sid,跑完collapse之後,每個學生只剩一筆資料了。

stata aggregate 2

但這有可能不是你要的,你可能還想維持長格式,那該怎麼辦呢?重新載入資料,我們從頭來過。

如果想知道每個學生平均words,那可以利用egen指令:

bys sid: egen avgwords = mean(words)

結果如下圖所示:

stata aggregate 3

兩種方法都可以,但結果稍有不同。要選用哪種,就看你要作哪種分析。

5 則留言:

  1. Lin博士,您好:
    常看您的博客,从您的博客中获益良多。最近有个STATA编程的问题想请教您。

    有如下格式数据:
    ID Date Var1
    AA 1980/01/02
    B 1980/01/31
    C 1982/02/16
    D 1982/03/18
    AA 1982/03/21
    AA 1982/03/21
    B 1982/03/22
    AA 1983/06/30
    E 1985/11/22
    AA 1985/12/31
    G 1987/01/01
    D 1991/02/27
    ...
    AA 1999/03/16
    ...
    Z 2010/12/31

    想在Var1列生成本行对应ID过去5年重复出现的次数(不计当次)。举例来说,对应AA 1985/12/31行,Var1应显示3
    请问如何用stata编程?

    非常感谢!

    回覆刪除
  2. @Xiaofei Xing,

    很想幫你,但一下子沒想出寫法。如果能丟進資料庫,用sql語法可能快一點。Stata實在是沒想到怎麼處理。

    回覆刪除
  3. 版主您好,時常閱讀您的部落格,從中受益良多,非常感謝您的分享。

    最近在Stata資料處理上遇到一些問題,不知能否請教您?

    我正在處理一個longitudinal 資料庫的工作史資料 (美國的NLSY),

    目前遇到一個辨別及抓取資料的難題,

    每個受訪者都有超過20年資料, (1979-2010)

    工作史部分的問題是以整個訪問期間週別作為呈現方式 (week 1- week1740 )

    我想要的資料是 每年最近的一份工作其中有多少週是 full-time 有多少週是part-time

    我已經整理好每年該份工作的起始與結束的週別 (例如 week 325-week785)

    資料庫本來就有 每工作者每週工作時數的資料,如 week1 = 35, week2= 20...

    所以我現在有的資料是:

    Case id/ year/最近工作起始週/最近工作結束/year/最近工作起始週/最近工作結束週/...week1 worked hr/week2 worked hr/….week1740 worked hour

    1 /1979 /1 /52 /1980 /53 /86 … 35 /20 /…20
    2 /1979 /20 /52 /1980 /20 /100...35/40/…10
    3 /1979 /3 /40 /1980 /50 /99...20/20/…0
    …………..

    我想要的是,讓Stata自己抓取 工作起始週 與 工作結束週,例如 week20- week52

    然後再自己下去對照 每週的工時,分辨出哪些週是 part-time 哪些週是 full-time

    然後建立兩組變項 1979年最近工作full-time週數、 1979年最近工作part-time週數.........一直到2010年,

    試了好幾天都試不出來,不知道版主有沒有什麼好建議呢?

    非常謝謝您!

    回覆刪除
  4. 版主您好
    時常看您的部落格學到很多東西
    想請問您一個問題
    假如有筆資料是這樣
    id time length
    1 1 1.5
    1 2 1.7
    1 3 .
    2 1 3.8
    2 2 3.6
    2 3 .
    3 1 2.3
    3 2 2.4
    3 3 .

    想要把每一組(id)的length 第一筆資料/第二筆資料,製造一個新變數叫delta(亂取的)
    該怎麼做呢?

    我只想到要用gen 然後不知道要怎麼用才好..
    非常感謝><

    回覆刪除