如何在特定于备用数据的组织中避免重复某个变量?

时间:2014-06-26 14:45:55

标签: 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是购买所属的产品类别,

周 - 购买发生的那一周,

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

有可能吗?

非常感谢你!

1 个答案:

答案 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后,也应该工作并且更简单。