【问题标题】:Averaging values across certain groups in StataStata中某些组的平均值
【发布时间】:2014-10-29 21:48:35
【问题描述】:

已编辑,见下文。

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

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

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

原始数据集如下所示:

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) 

【问题讨论】:

  • 没有代码的问题在这里被广泛认为是题外话。该网站并不是真正关于“什么是好的代码?”但是“我的代码有什么问题?”我已经回答了这个问题,但还是添加了这个评论。

标签: stata


【解决方案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) 

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

【讨论】:

  • 谢谢!请参阅我的问题的编辑部分。
  • 添加一些真实的数据很有帮助。请尝试修改后的代码。
  • 博士。考克斯,非常感谢您的反馈。编辑后的版本效果很好。在我的 700,000 次观察数据集中,我能够识别出在所有商店销售的一组品牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2016-03-20
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多