Stata:如果所有观察结果都是唯一的,则跳过代码

Stata:如果所有观察结果都是唯一的,则跳过代码,stata,Stata,我有一个数据集,告诉我每个全科医生(GP)向每家医院转诊的次数 如果数据中至少有一个GP将患者推荐到两个(或更多)不同的医院,那么我想运行一些额外的代码,否则我不会 我正在使用以下代码: set more off gsort GP -referrals by code: gen nvals = _n ==1 generate obs = _N if nvals != obs { display "different number of unique observations as total

我有一个数据集,告诉我每个全科医生(GP)向每家医院转诊的次数

如果数据中至少有一个GP将患者推荐到两个(或更多)不同的医院,那么我想运行一些额外的代码,否则我不会

我正在使用以下代码:

set more off
gsort GP -referrals
by code: gen nvals = _n ==1
generate obs = _N

if nvals != obs {
display "different number of unique observations as total observations-therefore I will run additional code here"
continue
}
display "same number of unique observations as total observations-therefore for this loop I don't wish to run additional code"
目前,这似乎不起作用

有人能帮我开发这个代码吗?也就是说,如果观察的总数等于唯一观察的总数,我知道我可以跳过代码的下一部分-这将转到我当前拥有的地方:

display "different number of unique observations as total observations-therefore I will run additional code here"

我找到了更多的解决办法

set more off
gsort GP -referrals
by code: gen nvals = _n ==1
generate firststep = sum(nvals)
egen unique = max(firststep)
generate obs = _N

if unique != obs {
display "different number of unique observations as total observations-therefore I will run additional code here"
continue
}
display "same number of unique observations as total observations-therefore for this loop I don't wish to run additional code"

似乎正在发挥作用

一个简单的解决方案是
isid
,结合
捕获
。例如,
auto
数据集由
make
变量唯一标识,但我们可以生成一个非唯一的
manufacturer
变量来说明这一想法:

sysuse auto , clear
gen manufacturer = word(make, 1)

capture isid manufacturer
if _rc != 0 di "observations by manufacturer are not unique"
else if _rc == 0 di "observations by manufacturer are unique"

capture isid make
if _rc != 0 di "observations by make are not unique"
else if _rc == 0 di "observations by make are unique"

这里有两个相关的问题。我将把它们分开:

1。命令if(与if限定符不同)

这种构造

if nvals != obs { 
...
} 
可能是Stata错误的主要来源,通常会咬到那些习惯于在其他软件中以特定方式进行解释的人

如果要比较的两个项目是标量或宏,那么通常情况下一切正常。(如果这两个项目无法比较,那么斯塔塔会抱怨,但这不是问题所在,只是暂时令人困惑。)

如果这两项都是变量,那么问题就可能出现,你的问题和答案也是如此Stata不会将此构造视为一个默认循环,因此每次观察都会重复做出决定。相反,Stata总是将其解释为(在本例中)

所以,一般来说,Stata在第一次观察中,只在第一次观察中,观察变量的值。如果变量在整个观测过程中实际上是恒定的,那么一切都会好起来;否则,代码将合法运行,但很可能给出的答案至少令人费解,而且往往是错误的

这个陷阱是一个常见问题

2。不同的值

另一个问题是,问题中的代码在任何极端情况下都不会生成不同(您称为“唯一”)值的数量。您不提供可复制的示例,但在任何数据集中,都可以使用变量
code

by code: gen nvals = _n ==1
generate obs = _N
将产生一个值为1或0的变量
nvals
,以及另一个包含观察次数的变量
obs
。当且仅当整个数据集中只有一个观测值,且计算未涉及任何其他情况下的不同值时,这两者将相等。虽然您可能意识到了这一点,但对线程感兴趣的人应该对逻辑感兴趣

代码

by code: gen nvals = _n ==1
generate firststep = sum(nvals)
egen unique = max(firststep)
计算
code
的不同值的数量。因为这是一个标量,所以更简单的方法可能是

by code: gen nvals = _n ==1
count if nvals == 1 
scalar unique = r(N) 
无需创建两个额外变量
firststep
unique
。变量
obs
也是冗余的,因为
if
语句可能只是

if unique != _N 
关于这一问题的审查,包括对“独特”一词的评论,见。如果您对代码感兴趣,
在Stata中搜索distinct
,以查找最新版本

1。二,。一起


现在应该很清楚,您自己的答案中的
if
命令将按需要工作,因为所讨论的变量是常量

一个相关的想法是寻找两个变量的重复项。
if unique != _N