互斥条件在Stata中不起作用

时间:2015-05-07 07:29:36

标签: if-statement stata

我在Stata上有一些数据,包括logTAclass等变量。我有超过一千个观察值,logTA没有任何缺失值。数据如下所示:

logTA       class
--------    --------
.           
.           
21.26871    
.           

现在,我想要做的是根据以下简单规则为class变量赋值:

replace class = 1 if logTA < mean(logTA) - sd(logTA)
replace class = 2 if logTA >= mean(logTA) - sd(logTA) & logTA < mean(logTA) + sd(logTA)
replace class = 3 if logTA >= mean(logTA) + sd(logTA)

看起来很简单,但Stata没有可以这种方式使用的mean()和sd()函数。无论如何,我用19.76543和sd(logTA)替换了平均值(logTA)和1.507828。

然而,在许多观察结果中,logTA = 21.26871的观察结果未被分配任何类别。当我的条件相互排斥时,这怎么可能呢?

我在这里上传了我的文件:http://wikisend.com/download/187254/problem.dta 当我试图简化要发送到此处的数据集时,我意识到更改变量名称可以解决问题。因此,为了重现错误,只需运行以下代码并检查最后9行。

gen sBuyuklukSinifi = .
replace sBuyuklukSinifi = 1 if logmToplamVarliklar < 19.76543 - 1.507828
replace sBuyuklukSinifi = 2 if logmToplamVarliklar >= 19.76543 - 1.507828 & logmToplamVarliklar < 19.74152 + 1.507828
replace sBuyuklukSinifi = 3 if logmToplamVarliklar >= 19.76543 + 1.507828

2 个答案:

答案 0 :(得分:0)

以下是我如何实现这一目标:

/* Fake Data */
clear
set seed 5615
set obs 100000
generate logTA = rnormal(19.76543,1.507828)
replace logTA=21.26871 in 1

summarize logTA, detail
generate class = . 
replace class = 1 if logTA < r(mean) - r(sd)
replace class = 2 if inrange(logTA,r(mean) - r(sd),r(mean) + r(sd))
replace class = 3 if logTA >= r(mean) + r(sd)

计算结果由summarize存储在r()中,以便可以轻松访问并替换为后续命令,而不是键入值。

我不确定为什么你的代码不起作用。我得到与上面相同的答案:

generate class2 = . 
replace class2 = 1 if logTA < 19.76503 - 1.513932
replace class2 = 2 if inrange(logTA,19.76503 - 1.513932,19.76503 + 1.513932)
replace class2 = 3 if logTA >= 19.76503 + 1.513932
tab class class2

答案 1 :(得分:0)

与Dimitriy一样,我无法重现您的问题,因此必须将您标题中的断言视为未经证实。

这是我的检查,同时确认优先规则(首先评估哪个操作)不咬人。

. local a 21.26871  

. di `a' >= 19.76503 - 1.507828 & `a' < 19.76503 + 1.507828 
1

. di (`a' >= 19.76503 - 1.507828) & (`a' < 19.76503 + 1.507828) 
1

我注意到有问题的价值不在于围栏:

. di 19.76503 + 1.507828
21.272858

不是问题,但egen具有std()功能。然后,您可以根据需要对结果进行舍入,但统计分类只是丢弃信息。