2011-05-18 154 views
3

我在Stata一些數據看起來像的前兩列:我如何將Stata中的觀察內容排名?

group_id var_to_rank desired_rank 
____________________________________ 

1   10   1 
1   20   2 
1   30   3 
1   40   4 
2   10   1 
2   20   2 
2   20   2 
2   30   3 

我想根據一個變量(var_to_rank)來創建的組(GROUP_ID)內的每個觀察的秩。通常情況下,爲了這個目的我用:

gen id = _n 

但是我的一些意見(GROUP_ID = 2在我的小例子)有排名變量的值相同而這種做法是行不通的。

我也嘗試使用:使用不同的選項

egen rank 

命令,但不能讓我的等級變量做出樣子desired_rank。

你能指點我解決這個問題嗎?

回答

2

我想說這個問題是造成的爲了最好的理解錯誤的方式。目的是對觀察進行分組,其中最低值的分配全部被分配1級,下一個最低分配全部分配2個等等。這並不是我所見過的大多數意義上的排名,但Stata的egen, rank()確實能讓你成爲其中的一部分。

但是這是在Statalist線程提到上面提到的直接方式,就是在精神上比引述任何解決方案更簡單:

bysort group_id (var_to_rank): gen desired_rank = sum(var_to_rank != var_to_rank[_n-1]) 

一旦數據被上var_to_rank排序,然後當值從先前的值不同每個不同值的塊的開始值爲1是var_to_rank != var_to_rank[_n-1]的結果;否則結果是0。累計這些1和0可得到所需的變量。前綴命令bysort進行所需的排序,並確保這些都是在由group_id定義的組內單獨完成的。根本不需要egen(許多隻使用Stata的人經常會發現奇怪的命令)。

感興趣的聲明:所引用的Statalist線程表明,當被問到類似的問題時,我也沒有把這個解決方案看成一個。

+0

非常感謝。優秀的打字員。我也不確定這個問題的確切標題,但是因爲這個命令在這裏很重要,所以決定與'組'排在一起。如果您有更好的建議,請隨意修改問題和/或標題。 – radek

7

對我來說,以下工作:

bysort group_id: egen desired_rank=rank(var_to_rank) 

enter image description here

+0

由於葉綠素。我也嘗試過。然而,有可能獲得1,2,3等級而不是1,2,5,4? – radek

+2

@radek當然:'bysort group_id:egen desired_rank = rank(var_to_rank),唯一'會爲組2賦予'1 2 3 4',並且用'track'代替'unique'會給你'1 2 2 4'。 – chl

+0

正如你所說的'獨特'選項給我'1,2,3,4',我的目標是'1,2,2,3'。 – radek

5

Statalist偶然發現了這樣的解決方案:

bysort group_id (var_to_rank) : gen rank = var_to_rank != var_to_rank[_n-1] 
by group_id : replace rank = sum(rank) 

似乎來解決這個問題。

3

@radek:你一定有它在此期間整理出...但是這將是一個簡單的(雖然不是很優雅)的解決方案:

bysort group_id: egen desired_rank_HELP =rank(var_to_rank), field 
egen desired_rank  =group(grup_id desired_rank_HELP) 
drop desired_rank_HELP 
+0

謝謝。沒有想過如何使用'egen group'。 – radek

0

太多的工作。簡單而優雅。試試這個。

根desired_rank = INT(var_to_rank/10)

+2

當然,這適用於給出的簡單數值例子,但它顯然不是一般的解決方案,所以這忽略了這一點。 –

+1

(實際上,對於給出的例子,int()是多餘的)。 –

0

試試這個命令,它爲我工作這麼好:egen newid=group(oldid)

+1

當然,這適用於給出的簡單數值例子,但它通常不是一個解決方案,所以這忽略了一點。例如,將第一個值更改爲5,然後第二個組的第一個排名將不再爲1.問題是_within_ groups排名。 –