1

我在下面创建了我的代码的玩具示例。在这个玩具示例中,我想创建一个自创建参考组中所有较高价格减去较低价格的度量。因此,在每个参考组中,我想将每个人从同一组中其他人的所有更高价格值中减去其价格值。我不想有负面的差异。然后我想总结所有这些差异。在创建此代码时,我在这里找到了一些帮助: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*
4

2 回答 2

1

如果我理解正确,这甚至不是需要显式循环的问题。所有更高价格的总和只是两个累积总和之间的差。如果价格捆绑,您可能需要考虑要做什么。

. 清除

. 设置 obs 10
obs 是 0,现在是 10

. 基因组 = _n > 5

. 设置种子 2803

. 创价 = ceil(1000 * runiform())

. bysort group (price) : gen sumhigherprices = sum(price)

. 按组:替换 sumhigherprices = sumhigherprices[_N] - sumhigherprices
(进行了 10 项实际更改)

. 列表

     +----------------------------+
     | 团价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 
于 2013-10-28T13:31:49.957 回答
1

如果我正确理解问题的措辞,也许这会有所帮助。它使用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)
于 2013-10-28T14:01:59.873 回答