Stata 如何计算序列中迄今为止看到的最大值或最小值及其相关id?

Stata 如何计算序列中迄今为止看到的最大值或最小值及其相关id?,stata,Stata,从中,我知道问题第一部分的答案。但在这里,我想更进一步。假设我有以下数据(已按未显示的变量排序): 要计算这个序列中的最小值,我需要 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

从中,我知道问题第一部分的答案。但在这里,我想更进一步。假设我有以下数据(已按未显示的变量排序):

要计算这个序列中的最小值,我需要

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\u 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)

genid\u min=id如果这对您的示例有效。它使用用户编写的命令
vlookup
,您可以运行
findit vlookup
并通过出现的链接安装该命令

clear
set more off

input ///
str1 id v1 
A  9  
B  8  
C  7  
B  7  
A  5  
C  4  
A  3  
A  2  
end

encode id, gen(id2)
order id2
drop id

list

*----- what you want -----

// your code
generate minsofar = v1 if _n==1
replace  minsofar = min(v1[_n-1], minsofar[_n-1]) if missing(minsofar)

// save original sort
gen osort = _n

// group values of v1 but respecting original sort so values of 
// id2 don't jump around
sort v1 osort

// set obs after first as missing so id2 is unique within v1
gen v2 = v1
by v1: replace v2 = . if _n > 1

// lookup
vlookup minsofar, gen(idmin) key(v2) value(id2)

// list
sort osort
drop osort v2
list, sep(0)
您的代码具有
generate minsofar=v1 if _n==1
,该代码最好编码为
generate minsofar=v1 in 1
,因为它更高效


您的
minsofar
变量只是
v1
的一个替换副本,因此如果总是这样,应该有更简单的方法来处理您的问题。我怀疑你的问题比你之前承认的要容易,这是通过你的帖子得到的。也许提供更多的上下文、扩展的示例数据等可以为您提供更好的建议。

这比目前暗示的更容易,也更具挑战性。给定
(比OP的
v1
更能唤起人们的回忆)以及到目前为止跟踪最小值的愿望,例如

 generate min_so_far = value[1] 
 replace min_so_far = value if value < min_so_far[_n-1] in 2/L 
至少有两个转折可能会产生影响。OP提到标识符可能丢失,因此我们可能有一个新的最小值,但不知道它的标识符。刚才给出的代码将使用缺少的标识符,但如果希望用已知标识符分别跟踪最小值的标识符,则需要不同的代码


迄今为止还没有提到的一个转折点是,具有不同标识符的观测值到目前为止可能都具有相同的最小值。上述代码仅在第一次看到特定最小值时替换标识符;如果想要记录上一次事件的标识符,
只有你知道什么适用于你的真实数据,因为我们只能访问你发布的示例;“现在之前的最小值”是我真正的意思,所以解决方案没有问题。不过有一件事是:如果你在
中使用
和中使用,斯塔塔会抱怨——正如你正确猜测的那样,我确实有纵向数据;这让我想起了为什么我要使用Stata常见问题解答中提供的更复杂的结构。仍然有一个bug,如“以前的最小值”应该在第一次观察中声明为缺失,因为之前的定义不清楚。在
by:
下,如果{n==1
则1中的
必须是
,如果{n>1
则2/L中的
可以是
 generate min_so_far = value[1] 
 replace min_so_far = value if value < min_so_far[_n-1] in 2/L 
 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