Stata:如果所有观察结果都是唯一的,则跳过代码
我有一个数据集,告诉我每个全科医生(GP)向每家医院转诊的次数 如果数据中至少有一个GP将患者推荐到两个(或更多)不同的医院,那么我想运行一些额外的代码,否则我不会 我正在使用以下代码: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
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