我在Stata上有一些数据,包括logTA
和class
等变量。我有超过一千个观察值,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
答案 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()
功能。然后,您可以根据需要对结果进行舍入,但统计分类只是丢弃信息。