塔塔:的foreach创造太多的变数 - (Stata: foreach creates too m

2019-10-18 20:53发布

我创造了我下面的代码玩具的例子。 在这个玩具的例子,我想自己创造参照组中创建所有更高的价格减去价格较低的测量。 因此,每个对照组中,我想借此每一个人,并从同一组中的其他人都较高的价格值减去它的价格价值。 我不想有负面的差异。 然后,我想总结所有这些差异。 在创建这个代码,我发现了一些帮助在这里: 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*

Answer 1:

如果我理解正确这,这甚至不是一个需要显式循环的问题。 所有价格较高的总和是短短两年累计总和之间的差异。 你可能需要考虑过要怎么做,如果价格挂钩的。

. 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 


Answer 2:

如果我没有理解问题的措辞,也许这可以帮助。 它采用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)


文章来源: Stata: foreach creates too many variables -