如何使用 Stata 将最大值应用于整个组
How to apply maximum value to a whole group using Stata
我想 generate
变量 max_count
其中,对于给定的组 ID,如果当前年份的 count
值高于上一年,则 max_count
取当前年份的值。当年的值将应用于随后的年份,直到出现比当年更高的值。例如,在下面的 ID 2 示例中,count
在 2001 年的值为 10,但随后的年份(2002 年和 2003 年)的值小于 10(即 2 和 4),因此 2002 年和 2003 年采用值为 10(2001 年之后的最高值)。
我使用了这个 Stata 代码,但它不起作用:
bysort id (Year): gen max_count=max(count, count[_n-1])
最高值仅适用于紧随其后的年份,而不适用于所有后续年份。
ID Year count max_count
1 2000 5 5
1 2001 0 5
1 2002 3 5
1 2003 7 7
2 2000 5 5
2 2001 10 10
2 2002 2 10
2 2003 4 10
3 2000 2 2
3 2001 5 5
3 2002 9 9
3 2003 6 9
clear
input ID Year count max_count
1 2000 5 5
1 2001 0 5
1 2002 3 5
1 2003 7 7
2 2000 5 5
2 2001 10 10
2 2002 2 10
2 2003 4 10
3 2000 2 2
3 2001 5 5
3 2002 9 9
3 2003 6 9
end
bysort ID (Year) : gen wanted = count[1]
by ID : replace wanted = max(wanted[_n-1], count) if _n > 1
list, sepby(ID)
+---------------------------------------+
| ID Year count max_co~t wanted |
|---------------------------------------|
1. | 1 2000 5 5 5 |
2. | 1 2001 0 5 5 |
3. | 1 2002 3 5 5 |
4. | 1 2003 7 7 7 |
|---------------------------------------|
5. | 2 2000 5 5 5 |
6. | 2 2001 10 10 10 |
7. | 2 2002 2 10 10 |
8. | 2 2003 4 10 10 |
|---------------------------------------|
9. | 3 2000 2 2 2 |
10. | 3 2001 5 5 5 |
11. | 3 2002 9 9 9 |
12. | 3 2003 6 9 9 |
+---------------------------------------+
中有关于如何获得此类记录的详细讨论(到目前为止的最大值或最小值是“记录”,如体育运动)
对于单线解决方案,从 SSC 安装 rangestat
,然后
rangestat (max) WANTED = count, int(Year . 0) by(ID)
记录发生时间的问题自然是相关的:
by ID : gen when = Year[1]
by ID : replace when = cond(wanted > wanted[_n-1], Year, when[_n-1]) if _n > 1
我想 generate
变量 max_count
其中,对于给定的组 ID,如果当前年份的 count
值高于上一年,则 max_count
取当前年份的值。当年的值将应用于随后的年份,直到出现比当年更高的值。例如,在下面的 ID 2 示例中,count
在 2001 年的值为 10,但随后的年份(2002 年和 2003 年)的值小于 10(即 2 和 4),因此 2002 年和 2003 年采用值为 10(2001 年之后的最高值)。
我使用了这个 Stata 代码,但它不起作用:
bysort id (Year): gen max_count=max(count, count[_n-1])
最高值仅适用于紧随其后的年份,而不适用于所有后续年份。
ID Year count max_count
1 2000 5 5
1 2001 0 5
1 2002 3 5
1 2003 7 7
2 2000 5 5
2 2001 10 10
2 2002 2 10
2 2003 4 10
3 2000 2 2
3 2001 5 5
3 2002 9 9
3 2003 6 9
clear
input ID Year count max_count
1 2000 5 5
1 2001 0 5
1 2002 3 5
1 2003 7 7
2 2000 5 5
2 2001 10 10
2 2002 2 10
2 2003 4 10
3 2000 2 2
3 2001 5 5
3 2002 9 9
3 2003 6 9
end
bysort ID (Year) : gen wanted = count[1]
by ID : replace wanted = max(wanted[_n-1], count) if _n > 1
list, sepby(ID)
+---------------------------------------+
| ID Year count max_co~t wanted |
|---------------------------------------|
1. | 1 2000 5 5 5 |
2. | 1 2001 0 5 5 |
3. | 1 2002 3 5 5 |
4. | 1 2003 7 7 7 |
|---------------------------------------|
5. | 2 2000 5 5 5 |
6. | 2 2001 10 10 10 |
7. | 2 2002 2 10 10 |
8. | 2 2003 4 10 10 |
|---------------------------------------|
9. | 3 2000 2 2 2 |
10. | 3 2001 5 5 5 |
11. | 3 2002 9 9 9 |
12. | 3 2003 6 9 9 |
+---------------------------------------+
中有关于如何获得此类记录的详细讨论(到目前为止的最大值或最小值是“记录”,如体育运动)
对于单线解决方案,从 SSC 安装 rangestat
,然后
rangestat (max) WANTED = count, int(Year . 0) by(ID)
记录发生时间的问题自然是相关的:
by ID : gen when = Year[1]
by ID : replace when = cond(wanted > wanted[_n-1], Year, when[_n-1]) if _n > 1