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

Graph Stata-保留编码变量和堆叠图形,graph,visualization,stata,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

这些数据代表了冰激凌偏好,个人可以随时间改变这些偏好

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\u enc
显示的是一个数字,但在Stata中,它将以蓝色显示字符串名称,表示数字

两个问题

例如,当我创建一个编码的变量时

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

变量
first\u pref
采用编码的数字,但是,我希望它的格式与
flavor\u 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

我尝试使用堆叠选项
图形栏
,但没有成功。我也可以在Stata之外看到如何做到这一点,但我希望Stata具备这一功能

我对措辞不太清楚,但我相信第一个问题可以通过
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\u 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)
但肯定有更好的办法。我很少使用这些,所以我的经验很少


关于它的适当性,我不能说太多,除了这个例子,它似乎是一种严重的空间浪费。

在您的示例数据中,您是否知道
C
S
V
对于
id==2>都被编码为
3
?还存在其他不一致之处。他们是故意的吗?您首先提到一个变量
first\u pref
,但您编码
initial\u pref
。这些应该是一样的吗?@RobertoFerrer谢谢你,那是个打字错误。修正了“格式”这个词在计算中严重超载,这不是你的错。但至关重要的是,Stata对显示格式的感觉与您的问题无关,您的问题似乎是关于保留价值标签的,正如@RobertoFerrer所解释的,一个词的答案是
clonevar
。这只适用于某些情况,但在使用max之类的工具时不起作用。它仍然返回编码的数字,而不是编码变量的格式。您所说的“使用max之类的东西”是什么意思?我在您的示例代码中没有看到
max()
。此外,您所说的“…不是编码变量的格式”是什么意思?从
帮助clonevar
:“clonevar生成的新变量是现有变量varname的精确副本,其存储类型、值和显示格式与varname相同。varname的变量标签、值标签、注释和特征也将被复制。”我只举了一个从编码的,但是想要一个更一般的解决方案,那么你原来的例子就不够有代表性;我们也猜不出你想的是更“一般”的东西,除非你明确地说出来。我认为 CRONEVAR 一个通用的解决方案:克隆一个变量,然后在其中放入期望的值。我还提供了一个替代方案(没有示例)。
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)