For loop Stata:foreach创建的变量太多-

For loop Stata:foreach创建的变量太多-,for-loop,stata,For Loop,Stata,我在下面创建了一个代码的玩具示例。 在这个玩具示例中,我想创建一个自创参考组中所有较高价格减去较低价格的度量。因此,在每个参照组中,我想取每个个体,从同一组中其他个体的所有较高价格值中减去其价格值。我不想有负面的差异。然后我想总结一下所有这些差异。在创建此代码时,我在此处找到了一些帮助: 然而,代码对我来说并不完美,因为我的数据集相当大(几个10万OB),网站上的示例和代码只在Stata中的numlist最大值达到1600之前有效。(我正在使用版本12)。自动数据集的玩具示例可以工作,因为数据

我在下面创建了一个代码的玩具示例。 在这个玩具示例中,我想创建一个自创参考组中所有较高价格减去较低价格的度量。因此,在每个参照组中,我想取每个个体,从同一组中其他个体的所有较高价格值中减去其价格值。我不想有负面的差异。然后我想总结一下所有这些差异。在创建此代码时,我在此处找到了一些帮助:

然而,代码对我来说并不完美,因为我的数据集相当大(几个10万OB),网站上的示例和代码只在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 | +--------------------------+
如果我正确理解问题的措辞,也许这会有所帮助。它使用
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)

尝试使用
forvalues
,因为它更简单、更高效(正如您提到的网站所说)谢谢,不幸的是,我尝试了,并遇到了同样的问题。使用
sum()
也是回答您上一个问题的关键!!!谢谢你的帮助!很抱歉,我没有看到解决方案之间的连接。我的意思有点不同:根据我的想法,你们的团队:1 sumhigherprices应该看起来像25272175170,10,0。无论如何,我感谢你的帮助,再次抱歉,我没有看到问题之间的联系。谢谢你的耐心和帮助。您的解决方案在玩具示例中非常有效。出于某种原因,我在数据集中得到了一些负值,但还没有弄清楚,但我会在这里留下一条评论,以备将来参考。我警告过,捆绑价格需要考虑。
joinby
是一种很好的统计技术。需要注意的一件事是,一个大数据集可能会变得非常大,至少是暂时的,这也要感谢您!不幸的是,我可以证实尼克说的话。我刚才也尝试了你的解决方案,我得到了:“扩展值之和超过2147483647,数据集可能包含的观察值不超过2147483647。”我应该明确这一点。尽管@NickCox已经指出了这一点,但我还是编辑了这篇文章。此外,如果你找到了解决问题的答案,你应该点击旁边的复选标记“接受”它。这里+1。虽然
joinby
不适合OP的特定问题,但它是一个经常被忽略的命令。
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)