【问题标题】:Stata - Preserving encoded variable and stacked graphingStata - 保留编码变量和堆叠图形
【发布时间】:2015-02-19 15:42:30
【问题描述】:

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

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 具有该功能。

【问题讨论】:

  • 在您的示例数据中,您是否知道CSV 都被编码为3 for id ==2?还存在其他不一致。他们是故意的吗?你提到了一个变量first_pref,但你编码initial_pref。这些应该是一样的吗?
  • @RobertoFerrer 谢谢,这是一个错字。固定
  • “格式”这个词在计算中严重超载,这不是你的错。但至关重要的是,Stata 对显示格式的理解与您的问题无关,这似乎是关于保留价值标签的问题,正如@RobertoFerrer 解释的那样,一个字的答案是clonevar

标签: graph visualization stata


【解决方案1】:

措辞对我来说并不完全清楚,但我相信第一个问题可以用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)

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

我不能说它的适当性,除了这个例子,它似乎是对空间的严重浪费。

【讨论】:

  • 这仅适用于某些情况,但不适用于使用 max 之类的情况。它仍然返回编码后的数字,而不是编码变量的格式。
  • “当使用 max 之类的东西时”是什么意思?我在您的示例代码中看不到 max()。此外,“......不是编码变量的格式”是什么意思?来自help clonevar:“clonevar 生成 newvar 作为现有变量 varname 的精确副本,具有与 varname 相同的存储类型、值和显示格式。varname 的变量标签、值标签、注释和特性也将被复制。 "
  • 我只举了一个从编码创建变量的例子,但想要一个更通用的解决方案
  • 那你原来的例子不够有代表性;除非您明确说明,否则我们也无法猜测您正在考虑更“通用”的东西。我认为clonevar 是一个通用解决方案:克隆一个变量,然后将所需的值放入其中。我还提供了一个替代方案(没有示例)。
猜你喜欢
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2020-08-30
  • 2011-02-06
相关资源
最近更新 更多