首页 > 解决方案 > 创建虚拟变量的问题

问题描述

治疗区是 ID 为 1、2、3、6、14 的五个区。“忒修斯行动”政策从第 80 周持续到第 85 周。

ocu: 行政区号

我尝试创建假人,treatedtime他们只是显示为零

gen treated =0 if missing(ocu)==0
replace treated =1 if ocu==1/2/3/6/14
gen time = (week==80-85) & !missing(week)`

标签: statadummy-variable

解决方案


ocu == 1/2/3/6/14是一种合法的表达方式,但可能与您想要的相去甚远。

occ == 1 | occ == 2 | occ == 3 | occ == 6 | occ == 14 

合法且啰嗦

inlist(occ, 1, 2, 3, 6, 14) 

合法且可能具有吸引力的表达方式是:是否occ采用任何指定的值?

尽管 Stata 支持|作为“或”运算符(而不是/为此目的)请注意

occ == 1 | 2 | 3 | 6 | 14 

是合法的,但几乎不是任何人想要的,因为它已被解析

(occ == 1) | 2 | 3 | 6 | 14 

并且将始终被评估为 1 (true),而不管 的值如何occ,因为仅其他参数之一 2 3 6 14 为非零意味着整个表达式的评估结果为 1 (true)。

如果您希望表达式在 80 和 85 之间表示,则该表达式week==80-85的语法也是不正确的week。Stata 将评估week == 80-85,首先应用减法,然后测试 -5 是否相等。请参阅 中记录的优先规则help operators

所有运算符的评估顺序(从第一个到最后一个)是!(或 ~)、^、-(否定)、/、*、-(减法)、+、!=(或 ~=)、>、<、<=、>=、==、& 和 |.*

减法先于测试相等性。

您可能想要week >= 80 & week <= 85inrange(week, 80, 85).

如果week介于 80 和 85 之间,则不能丢失。该测试是多余的(但无害)。


推荐阅读