Stata - 保留编码变量和堆叠图形
Stata - Preserving encoded variable and stacked graphing
这些数据代表冰淇淋偏好,个人可以随时间改变这些偏好
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
或
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 具有该功能。
措辞对我来说不是很清楚,但我相信第一个问题可以用 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)
但肯定有更好的方法。我很少使用这些,所以我的经验很少。
关于它的适当性我不能说太多,除了对于这个例子,它似乎是对 space.
的极大浪费
这些数据代表冰淇淋偏好,个人可以随时间改变这些偏好
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
或
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 具有该功能。
措辞对我来说不是很清楚,但我相信第一个问题可以用 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)
但肯定有更好的方法。我很少使用这些,所以我的经验很少。
关于它的适当性我不能说太多,除了对于这个例子,它似乎是对 space.
的极大浪费