我创造了我下面的代码玩具的例子。 在这个玩具的例子,我想自己创造参照组中创建所有更高的价格减去价格较低的测量。 因此,每个对照组中,我想借此每一个人,并从同一组中的其他人都较高的价格值减去它的价格价值。 我不想有负面的差异。 然后,我想总结所有这些差异。 在创建这个代码,我发现了一些帮助在这里: http://www.stata.com/support/faqs/data-management/try-all-values-with-foreach/
但是,代码没有完全为我工作,因为我的数据集是相当大的(几个100K OBS),并在网站上的例子,我的代码只工作,直到在Stata的numlist最大的1600。 (我用12版)。 与自动数据集的玩具示例工作,由于数据集的尺寸小。
我想问一下,如果有人有一个想法,如何更高效地编写这一点,所以我可以围绕numlist限制得到。 我想过,但不保存在他们中间变量的差异直接相加,但也炸毁numlist限制。
clear all
sysuse auto
ren headroom refgroup
bysort refgroup : egen pricerank = rank(price)
qui: su pricerank, meanonly
gen test = `r(max)'
su test
foreach i of num 1/`r(max)' {
qui: bys refgroup: gen intermediate`i' = price[_n+`i'] -price if price[_n+`i'] > price
}
egen price_diff = rowmax(intermediate*)
drop intermediate*
如果我理解正确这,这甚至不是一个需要显式循环的问题。 所有价格较高的总和是短短两年累计总和之间的差异。 你可能需要考虑过要怎么做,如果价格挂钩的。
. clear
. set obs 10
obs was 0, now 10
. gen group = _n > 5
. set seed 2803
. gen price = ceil(1000 * runiform())
. bysort group (price) : gen sumhigherprices = sum(price)
. by group : replace sumhigherprices = sumhigherprices[_N] - sumhigherprices
(10 real changes made)
. list
+--------------------------+
| group price sumhig~s |
|--------------------------|
1. | 0 218 1448 |
2. | 0 264 1184 |
3. | 0 301 883 |
4. | 0 335 548 |
5. | 0 548 0 |
|--------------------------|
6. | 1 125 3027 |
7. | 1 213 2814 |
8. | 1 828 1986 |
9. | 1 988 998 |
10. | 1 998 0 |
+--------------------------+
编辑:对于OP的需求是什么,有一个额外的行
. by group : replace sumhigherprices = sumhigherprices - (_N - _n) * price
如果我没有理解问题的措辞,也许这可以帮助。 它采用joinby
(创建新的意见,并根据原始数据库的大小,您可能还是打不上观察的次数Stata的硬性限制)。 该代码重新将跟随从原岗位的代码的结果。 这是第二次尝试。 这最后的编辑前的代码没有提供抢手的结果。 问题的措辞是有些困难,我听不懂。
clear all
set more off
* Load data
sysuse auto
* Delete unnecessary vars
ren headroom refgroup
keep refgroup price
* Generate id´s based on rankings (sort)
bysort refgroup (price): gen id = _n
* Pretty list
order refgroup id
sort refgroup id price
list, sepby(refgroup)
* joinby procedure
tempfile main
save "`main'"
rename (price id) =0
joinby refgroup using "`main'"
list, sepby(refgroup)
* Do not compare with itself and drop duplicates
drop if id0 >= id
* Compute differences and max
gen dif = abs(price0 - price)
collapse (max) dif, by(refgroup id0)
list, sepby(refgroup)