Stata - 保留编码变量和堆叠图形

时间:2015-02-19 15:42:31

标签: graph visualization stata

这些数据代表冰淇淋偏好,个人可以随时间改变这些偏好

id      time   flavor_str     flavor_enc  
 1       1         C               1
 1       2         C               1
 1       3         V               2
 2       1         S               3
 2       2         V               2
 2       3         C               1
 3       1         V               2
 4       1         C               1  
 4       2         V               2

注意:flavor_enc显示一个数字,但在Stata中,它会显示蓝色的字符串名称,表示数字

两个问题。

当我从编码中创建变量时,例如

g initial_pref = 0
replace initial_pref = flavor_enc if = time == 1 

OR

bysort id: egen max_pref = max(flavor_enc)

变量first_pref采用编码数字,但是,我希望保持与flavor_enc相同的格式。

然后我想创建一个堆积条形图(按x轴上的味道)和频率(在y轴上)。该图表将有一个条形图,表示给定风味是某人的初始偏好的次数,第二条代表风味是某人的第二个偏好的次数(他们从他们的初始切换,0否则),最后一块代表味道是他们的第三选择的次数。

对于这些数据,图表将使用这些输入。

C as initial = 2
V as initial = 1
S as initial = 1

C as second = 0
V as second = 3
S as second = 0

C as third = 1
V as third = 0
S as third = 0

我尝试使用堆叠选项graph bar,但这不起作用。我也可以看到如何在Stata之外做到这一点,但希望Stata具备功能。

1 个答案:

答案 0 :(得分:2)

措辞对我来说并不完全清楚,但我相信第一个问题可以通过clonevar进行管理:

clonevar initial_pref2 = flavor_enc
replace initial_pref2 = 0 if time != 1

关于您的最新评论(和编辑),如果您想计算最大评论并仍然使用clonevar,则有可能:

clonevar max_pref2 = flavor_enc
bysort id (max_pref2): replace max_pref2 = max_pref2[_N]

如果flavor_enc中有错误,则需要进行调整。

另一种解决方案是使用扩展宏函数help extended_fcn)从原始变量中提取数据属性,并将它们分配给新变量。

解决图表问题的一种方法如下:

clear
set more off

*----- example data -----

input ///
id      time   str1 flavor_str     flavor  
 1       1         C               1
 1       2         C               1
 1       3         V               2
  2       3         C               1
 2       1         S               3
 2       2         V               2
 3       1         V               2
 4       2         V               2
  4       1         C               1  
end

drop flavor_str

sort id time
list, sepby(id)

*----- bar graph -----

quietly tabulate time, gen(tt)
collapse (sum) tt*, by(flavor)

label define lblflavor 1 "flavor 1" 2 "flavor 2" 3 "flavor 3"
label values flavor lblflavor

graph bar (asis) tt*, over(flavor) stack ///
    ylabel(none) blabel(bar, position(center)) legend(off)

但肯定有更好的方法。我很少使用这些,所以我的经验很少。

我不能说它的适当性,只是在这个例子中,它似乎是一种可怕的浪费空间。