平衡Stata中某些组的值

时间:2014-10-29 21:48:35

标签: stata

已编辑,请参阅下文。

我拥有一个事务级数据集。每个观察都是在特定商店发生的品牌的销售交易。一个这样的交易包含所购产品的品牌信息和每盎司产品的支付。我们可以清楚地区分这笔交易是否发生在商店#1,2,3 ......,10:总共有10家商店。数据集非常不平衡,这意味着每个商店都有不同数量的交易和可用品牌。一些商店有100,000笔交易,约60,000笔等等。

我的目标是通过计算这些交易的每盎司平均价格来了解每家商店的价格水平。如果我们对每家商店内的所有交易进行平均,我们就可以得到关于整体价格水平的扭曲图片,因为我们并未考虑所有商店中完全相同的产品组合。

因此,我需要生成一个与我的数据集分开的小表,它将计算在所有可用商店出售的那些品牌的平均价格。如果某个品牌甚至没有在其中一家商店出售,则必须忽略此交易以进行计算。

原始数据集看起来像:

brand   cents/oz    store
BrandA    9          1
BrandB    10         1
BrandC    6.5        1

BrandA    1          2
BrandB    2          2

BrandA    5          3
BrandB    6          3
BrandC    6.5        3

按照我的指示,我们将拥有:

store     avecents
  1          (9+10)/2=9.5 
  2          (1+2)/2=1.5
  3          (5+6)/2=5.5
 etc..

对于每个avecents计算,我们仅包括品牌A和品牌B,因为它们出现在每个商店中。品牌C完全被忽视,因为它没有在商店2出售。

根据Cox博士的反馈编辑:

以下是一个示例数据集,其中包含3个不同商店的品牌价格,108505310845901091828。如果我们使用Cox博士提供的代码egen tag = tag(brand store),Stata确实会在每个商店中标记不同的品牌。但是使用代码egen nstores = total(tag), by(store),Stata将只计算每个商店中的许多不同品牌,其中nstores=3。因此,第三个代码table brand store if nstores == 3, c(mean price)无效,因为列nstores包含品牌计数。您可以尝试以下代码:

clear
set more off
input str8 store str30 brand cenoz
1085053 SIERRA_NEVADA_PALE_ALE 9.715278
1085053 MILLER_HIGH_LIFE 5.319445
1085053 BACARDI_SILVER_MOJITO 9.013889
1085053 REDHOOK_ESB 9.430555
1085053 SMIRNOFF_ICE_GREEN_APPLE_BITE 9.360121
1085053 BIG_SKY_MOOSE_DROOL_BROWN_ALE 9.708333
1085053 WOODCHUCK_DRAFT_CIDER_DARK 8.872066
1085053 GRAIN_BELT_PREMIUM 6.937501
1085053 BACARDI_SILVER_MOJITO 9.013889
1085053 REDHOOK_ESB 9.430555
1084590 SAND_CREEK_SEASONAL 10.40278
1084590 MOLSON_CANADIAN 8.180555
1084590 NEWCASTLE_BROWN_ALE 8.256945
1084590 MICHELOB_GOLDEN_DRAFT_LIGHT 5.087963
1084590 SIERRA_NEVADA_PALE_ALE 12.63393
1084590 MILLER_HIGH_LIFE 6.013889
1084590 BACARDI_SILVER_MOJITO 9.020833
1084590 REDHOOK_ESB 7.625
1084590 SMIRNOFF_ICE_GREEN_APPLE_BITE 4.854167
1084590 BIG_SKY_MOOSE_DROOL_BROWN_ALE 12.48611
1091828 SIERRA_NEVADA_PALE_ALE 13.37798
1091828 MILLER_HIGH_LIFE 6.243055
1091828 SIERRA_NEVADA_PALE_ALE 13.37798
1091828 MILLER_HIGH_LIFE 6.243055
1091828 BACARDI_SILVER_MOJITO 8.319445
1091828 REDHOOK_ESB 6.590278
1091828 SMIRNOFF_ICE_GREEN_APPLE_BITE 5.782407
1091828 BIG_SKY_MOOSE_DROOL_BROWN_ALE 12.48611
1091828 MILLER_LITE 6.590278
1091828 BUD_LIGHT 5.895833
end

egen tag = tag(brand store) 
egen nstores = total(tag), by(store) 
table brand store if nstores == 3, c(mean cenoz)
collapse price if nstores == 3, by(brand store) 

1 个答案:

答案 0 :(得分:1)

对于每个品牌,我们要求它已在所有商店出售。 Stata在更一般的术语中对此问题进行了大量讨论,以计算不同的观察结果。如果我们只标记每个不同的商店 - 品牌组合一次(标签为0或1)

 egen tag = tag(brand store) 

然后在品牌上添加标签

 egen nstores = total(tag), by(brand) 

当且仅当nstores == 10时,所有10家商店都会销售一个品牌。所以你想要的手段由

制成表格
 table brand store if nstores == 10, c(mean cenoz)

并通过

输入简化数据集
 collapse cenoz if nstores == 10, by(brand store) 

编辑:上面修复了一个错误。