stata - 在特定替代数据组织过程中,如何避免某个变量的重复?

标签 stata

更新: 我很抱歉之前提供了一个非常简化的、不可重现的示例。这是可以复制的东西:

*使用此特定于案例的数据集:

week  units pr categ      id    avecenoz1   avecenoz2   avecenoz3
1667    1   0   1       371247  4.276693    4.871173    6.430658
1686    1   0   1       581457  4.372499    5.042025    6.45528
1656    1   0   2       217025  4.107188    4.900006    6.236501
1649    1   0   2       138704  4.355612    4.920326    6.548411
1685    1   0   3       575278  4.297557    4.971671    6.408175
1642    1   0   3       75440   4.290808    4.848145    6.384848
1655    1   0   3       204879  4.275114    4.905337    6.400794
1667    1   0   3       376364  4.276693    4.871173    6.430658
1671    1   1   3       426125  4.274153    5.001119    6.355516

id 是进行购买的客户的唯一客户 ID,

categ 是购买所属的产品类别,

week - 购买发生在哪一周,

avecenoz1 是特定周内类别 1 的平均价格,

avecenoz2 是特定周内类别 2 的平均价格,

avecenoz3 是特定周内类别 3 的平均价格,

单位始终等于 1,

pr 表示购买是否是促销事件 (1) 或非促销事件 (0)。

*Scott Long 用户编写的代码,用于将变量从特定于案例转换为特定于替代方案:

case2alt, alt(avecenoz) case(id) choice(categ) altnum(mode)

*这就是你得到的:

 id    mode week units pr cater avecenoz choice y1  y2  y3
75440   1   1642    1   0   3   4.290808    0   1   0   0
75440   2   1642    1   0   3   4.848145    0   0   1   0
75440   3   1642    1   0   3   6.384848    1   0   0   1
138704  1   1649    1   0   2   4.355612    0   1   0   0
138704  2   1649    1   0   2   4.920326    1   0   1   0
 138704 3   1649    1   0   2   6.548411    0   0   0   1
204879  1   1655    1   0   3   4.275114    0   1   0   0
204879  2   1655    1   0   3   4.905337    0   0   1   0
204879  3   1655    1   0   3   6.400794    1   0   0   1
217025  1   1656    1   0   2   4.107188    0   1   0   0
217025  2   1656    1   0   2   4.900006    1   0   1   0
217025  3   1656    1   0   2   6.236501    0   0   0   1
371247  1   1667    1   0   1   4.276693    1   1   0   0
371247  2   1667    1   0   1   4.871173    0   0   1   0
371247  3   1667    1   0   1   6.430658    0   0   0   1
376364  1   1667    1   0   3   4.276693    0   1   0   0
376364  2   1667    1   0   3   4.871173    0   0   1   0
376364  3   1667    1   0   3   6.430658    1   0   0   1
426125  1   1671    1   1   3   4.274153    0   1   0   0
426125  2   1671    1   1   3   5.001119    0   0   1   0
426125  3   1671    1   1   3   6.355516    1   0   0   1
575278  1   1685    1   0   3   4.297557    0   1   0   0
575278  2   1685    1   0   3   4.971671    0   0   1   0
575278  3   1685    1   0   3   6.408175    1   0   0   1
581457  1   1686    1   0   1   4.372499    1   1   0   0
581457  2   1686    1   0   1   5.042025    0   0   1   0 
581457  3   1686    1   0   1   6.45528     0   0   0   1

如您所见,转换后 pr 被复制了 3 次。但是,对于每个复制的交易,仅对于已售出的商品(而不是其余的选择),指示变量应等于 1。请帮助我防止 pr 重复自身。 谢谢!


原始消息:

我正在将数据集从特定于案例的数据集转换为特定于替代方案的数据集。原始数据集看起来像这样:

id   category   week   price1   price2    price3     pr

 1       1        1     4.24     4.88     3.35       1
 2       2        1     4.24     4.88     3.35       0
 3       3        1     4.24     4.88     3.35       1
 4       2        1     4.24     4.88     3.35       0

地点:

id 是进行购买的客户的唯一客户 ID,

类别是购买所属的产品类别,

week - 购买发生在哪一周,

price1 是类别 1 在特定周内的平均价格,

price2 是特定周内类别 2 的平均价格,

price3 是特定周内类别 3 的平均价格,

pr 表示购买是否是促销事件 (1) 或非促销事件 (0)。

如何确保 pr 在转换后不会复制自身?

通过使用代码

case2alt, alt(price) case(id) choice(category) altnum(mode)

这就是我得到的:

id   mode   week  cater  choice  price   y1    y2    y3    pr

 1     1     1      1       1    4.24     1     0     0    1
 1     2     1      1       0    4.88     0     1     0    1
 1     3     1      1       0    3.35     0     0     1    1
 2     1     1      1       0    4.24     1     0     0    0
 2     2     1      1       1    4.88     0     1     0    0
 2     3     1      1       0    3.35     0     0     1    0
 3     1     1      1       0    4.24     1     0     0    1
 3     2     1      1       0    4.88     0     1     0    1
 3     3     1      1       1    3.35     0     0     1    1
 4     1     1      1       0    4.24     1     0     0    0
 4     2     1      1       1    4.88     0     1     0    0
 4     3     1      1       0    3.35     0     0     1    0

除了公关之外,一切都运转良好。我不希望它为每个客户 ID 的所有可能替代方案重复自身。对于每个复制的交易,仅对于已售出的商品而不是其余的选择,指示变量应等于 1:

id   mode   week  cater  choice  price   y1    y2    y3    pr

 1     1     1      1       1    4.24     1     0     0    1
 1     2     1      1       0    4.88     0     1     0    0
 1     3     1      1       0    3.35     0     0     1    0
 2     1     1      1       0    4.24     1     0     0    0
 2     2     1      1       1    4.88     0     1     0    0
 2     3     1      1       0    3.35     0     0     1    0
 3     1     1      1       0    4.24     1     0     0    0
 3     2     1      1       0    4.88     0     1     0    0
 3     3     1      1       1    3.35     0     0     1    1
 4     1     1      1       0    4.24     1     0     0    0
 4     2     1      1       1    4.88     0     1     0    0
 4     3     1      1       0    3.35     0     0     1    0

可以吗?

非常感谢!

最佳答案

我使用merge的原始答案应该可以正常工作。下面是一个例子。

clear all
set more off

*----- original data -----

input ///
id   catchosen   week   pricea   priceb    pricec     pr
 1       1        1     4.24     4.88     3.35       1
 2       2        1     4.24     4.88     3.35       0
 3       3        1     4.24     4.88     3.35       1
 4       2        1     4.24     4.88     3.35       0
end

list

* modify some things to do a -merge- later on
rename catchosen alt
rename pr pr2

* save this data in a temporary file
tempfile orig
save "`orig'"


*----- data that your command produces -----

clear all

input ///
id   alt   week  cater  choice  price   y1    y2    y3    pr
 1     1     1      1       1    4.24     1     0     0    1
 1     2     1      1       0    4.88     0     1     0    1
 1     3     1      1       0    3.35     0     0     1    1
 2     1     1      1       0    4.24     1     0     0    0
 2     2     1      1       1    4.88     0     1     0    0
 2     3     1      1       0    3.35     0     0     1    0
 3     1     1      1       0    4.24     1     0     0    1
 3     2     1      1       0    4.88     0     1     0    1
 3     3     1      1       1    3.35     0     0     1    1
 4     1     1      1       0    4.24     1     0     0    0
 4     2     1      1       1    4.88     0     1     0    0
 4     3     1      1       0    3.35     0     0     1    0
end

* merge this data with the original data. keep only -pr2-
merge 1:1 id alt using "`orig'", keepusing(pr2)
replace pr2 = 0 if missing(pr2)

* compare -pr- with -pr2-. the latter is what you want.
list, sepby(id)  

但正如 Joe Canner 在 Statalist.org 中指出的那样,一个简单的:

replace pr = 0 if choice == 0

执行case2alt后,应该也可以工作并且简单得多。

关于stata - 在特定替代数据组织过程中,如何避免某个变量的重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433561/

相关文章:

r - R 中是否有与 Stata 的 PSACALC 等效的东西?

stata - Stata 中的数组/向量等价物

python - 如何在 Pandas 中创建多个列(就像 Stata 中的循环一样)?

Stata 中类似 Python 的 zip 函数?

python - 从 Stata 调用 Python

variables - Stata:通过移动后缀重命名变量

regex - 你如何在 Stata 中只提取字符串的大写部分?

stata - 为什么 coefplot 不绘制 Stata 中所有级别的交互?

r - 在 R 中保存变量标签以便 Stata 可以读取它们

Stata esttab 输出