更新: 我为之前提供一个非常简单,不可重复的例子而道歉。这是可以复制的东西:
*使用此特定于案例的数据集:
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是购买所属的产品类别,
周 - 购买发生的那一周,
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,
类别是购买所属的产品类别,
周 - 购买发生的那一周,
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
一切都运作良好,除了pr。我不希望它为每个客户ID的所有可能的替代品复制自己。对于每个复制的事务,指标变量应仅对于已售出的项目而不是其余选项的一个:
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
有可能吗?
非常感谢你!
答案 0 :(得分:3)
使用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
后,也应该工作并且更简单。