如何计算åºåˆ—中到目å‰ä¸ºæ­¢çœ‹åˆ°çš„最大值或最å°å€¼åŠå…¶ç›¸å…³ID?

时间:2014-10-16 03:12:32

标签: stata

从this Stata FAQ开始,我知é“问题第一部分的答案。但在这里,我想更进一步。å‡è®¾æˆ‘有以下数æ®ï¼ˆå·²ç»æŒ‰æœªæ˜¾ç¤ºçš„å˜é‡æŽ’åºï¼‰ï¼š

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)

至少为这个例å­ä¸­çš„æ•°æ®åšäº†å·¥ä½œã€‚ä¸çŸ¥é“它是å¦é€‚用于更å¤æ‚的案例。

2 个答案:

答案 0 :(得分:1)

这适用于您的示例。它使用用户编写的命令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的移ä½å‰¯æœ¬ï¼Œå› æ­¤å¦‚果情况总是如此,则应该有更简å•çš„方法æ¥å¤„ç†æ‚¨çš„问题。我怀疑你的问题比你现在承认的更容易,而且这已ç»é€šè¿‡ä½ çš„帖å­äº†ã€‚也许æ供更多背景,扩展示例数æ®ç­‰å¯ä»¥ä¸ºæ‚¨æ供更好的建议。

答案 1 :(得分:0)

到目å‰ä¸ºæ­¢ï¼Œè¿™æ¯”默示更容易,也更具挑战性。给定value(比OP v1更令人回味)并希望到目å‰ä¸ºæ­¢è·Ÿè¸ªæœ€å°å€¼ï¼Œä¾‹å¦‚

 generate min_so_far = value[1] 
 replace min_so_far = value if value < min_so_far[_n-1] in 2/L 

其中第二个语å¥åˆ©ç”¨Stata replace在当å‰è§‚察顺åºä¸­çš„ä¸è¶³ä¸ºå¥‡çš„事实。 [_n-1]是先å‰è§‚察的索引,in 2/L表示从第二个到最åŽä¸€ä¸ªè§‚察的所有观察的循环。

请注æ„OP的版本是错误的:通过始终查看之å‰çš„观察,代ç æ°¸è¿œä¸ä¼šæŸ¥çœ‹æœ€åŽä¸€ä¸ªå€¼ï¼Œå¦‚果它是一个新的最å°å€¼ï¼Œå°†å¿½ç•¥å®ƒã€‚å¯èƒ½OP在此之å‰çœŸæ­£æƒ³è¦ï¼†ï¼ƒ34;最å°åŒ–&#34;但到目å‰ä¸ºæ­¢ï¼Œè¿™å¹¶ä¸æ˜¯æˆ‘所ç†è§£çš„最低水平。

如果我们在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:的支æŒä¸‹å®Œæˆçš„。

我无法在此处寻求用户编写的扩展程åºã€‚