通过此Stata常见问题解答,我知道问题的第一部分的答案。但是在这里,我想更进一步。假设我有以下数据(已按未显示的变量排序):
id v1
A 9
B 8
C 7
B 7
A 5
C 4
A 3
A 2
为了计算此序列中的最小值,我这样做
generate minsofar = v1 if _n==1
replace minsofar = min(v1[_n-1], minsofar[_n-1]) if missing(minsofar)
要得到
id v1 minsofar
A 9 9
B 8 9
C 7 8
B 7 7
A 5 7
C 4 5
A 3 4
A 2 3
现在,我想生成一个变量,将其命名为id_min
给我提供与minsofar相关联的ID,例如
id v1 minsofar id_min
A 9 9 A
B 8 9 A
C 7 8 B
B 7 7 C
A 5 7 C
C 4 5 A
A 3 4 C
A 2 3 A
请注意,C与7关联,因为在当前排序中7首先与C关联。为了清楚起见,我的ID变量在这里只是为了便于阅读而显示为字符串变量,它实际上是数字。
有想法吗?
编辑:
我想
gen id_min = id if _n<=2
replace id_min = id[_n-1] if v1[_n-1]<minsofar[_n-1] & missing(id_min)
replace id_min = id_min[_n-1] if missing(id_min)
在此示例中,至少要为数据做这项工作。不知道它是否适用于更复杂的情况。
这比到目前为止所暗示的更加容易,同时也更具挑战性。给定value
(比OP更具启发性v1
)并且希望到目前为止跟踪最小值,例如
generate min_so_far = value[1]
replace min_so_far = value if value < min_so_far[_n-1] in 2/L
第二条陈述利用了Statareplace
在当前观察顺序中的不足为奇的事实。[_n-1]
是上一个观测值的索引,in 2/L
表示从第二个观测值到最后一个观测值的所有观测值都有一个循环。
请注意,OP的版本存在错误:通过始终查看先前的观察,代码将永远不会查看最后一个值,并且如果它是一个新的最小值,则会忽略该值。OP可能确实希望“现在之前最少”,但这不是我所理解的“到目前为止最少”。
如果我们有缺失值,则value
它们不会以任何有害的方式进入比较:Stata始终将缺失视为任意大,因此,当且仅当到目前为止不存在任何缺失时,才会记录缺失。是。
一目了然的最小值的标识符产生相同的逻辑
generate min_so_far = value[1]
gen id_min = id[1]
replace min_so_far = value if value < min_so_far[_n-1] in 2/L
replace id_min = id if value < min_so_far[_n-1] in 2/L
至少有两个可能被咬的曲折。OP提到了标识符可能丢失的可能性,因此我们可能有一个新的最小值,但不知道其标识符。刚刚给出的代码将使用丢失的标识符,但是如果希望用已知的标识符分别跟踪最小值的标识符,则需要不同的代码。
迄今为止未提及的一个问题是,到目前为止,具有不同标识符的观测值可能都具有相同的最小值。上面的代码仅在第一次看到特定最小值时才替换标识符。如果希望记录最后一次出现的标识符,则<
上面的最后一个代码行中的应当替换为<=
。如果希望跟踪到目前为止的所有最小标识符,则需要一个字符串变量来连接所有标识符。
使用面板或纵向数据的结构,整个工作在的主持下完成by:
。
我看不到有必要在此使用用户编写的扩展程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句