首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算到目前为止在序列中看到的最大值或最小值及其关联的id?

如何计算到目前为止在序列中看到的最大值或最小值及其关联的id?
EN

Stack Overflow用户
提问于 2014-10-16 03:12:32
回答 2查看 241关注 0票数 1

这个斯塔塔常见问题,我知道我问题的第一部分的答案。但在这里,我想再走一步。假设我有以下数据(已按未显示的变量排序):

代码语言:javascript
复制
id v1 
A  9  
B  8  
C  7  
B  7  
A  5  
C  4  
A  3  
A  2  

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

代码语言:javascript
复制
generate minsofar = v1 if _n==1
replace  minsofar = min(v1[_n-1], minsofar[_n-1]) if missing(minsofar)

要获得

代码语言:javascript
复制
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,所以类似于

代码语言:javascript
复制
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变量显示为字符串变量--实际上是数字变量。

想法?

编辑:

我想

代码语言:javascript
复制
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)

至少对本例中的数据执行此工作。不知道它是否适用于更复杂的案件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-16 09:21:36

到目前为止,这比暗示的要容易一些,也更具有挑战性。例如,考虑到value (比OP的v1更容易引起人们的注意)和到目前为止保持最低记录的愿望

代码语言:javascript
复制
 generate min_so_far = value[1] 
 replace min_so_far = value if value < min_so_far[_n-1] in 2/L 

其中第二个陈述利用了不令人惊讶的事实,斯塔塔replace是按目前的顺序观察。[_n-1]是前一次观测的索引,in 2/L意味着从第二次到最后一次对所有观测的循环。

请注意,OP的版本是错误的:通过始终查看前面的观察结果,代码永远不会查看最后一个值,如果它是一个新的最小值,则会忽略这一点。也许OP真的想要“以前的最低限度”,但这不是我所理解的“到目前为止的最低限度”。

如果我们在value中有缺失的值,他们不会以任何恶意的方式输入比较: Stata总是认为缺失是任意大的,所以只有在目前为止没有非缺失的情况下,才会记录缺失,这是应该的。

乍一看,该最小值的标识符将产生相同的逻辑。

代码语言:javascript
复制
 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:的主持下完成的。

我看不出有必要在这里使用用户写的扩展。

票数 0
EN

Stack Overflow用户

发布于 2014-10-16 03:53:02

这适用于你的例子。它使用用户编写的命令vlookup,您可以安装它,运行findit vlookup并通过显示的链接进行跟踪。

代码语言:javascript
复制
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的替代副本,所以如果总是这样,那么应该有更简单的方法来处理您的问题。到目前为止,我怀疑你的问题比你承认的要容易,这是通过你的职位。也许给出更多的上下文,扩展的示例数据,等等,可以得到更好的建议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26395627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档