如何适当指定本地宏来排除负值?

时间:2016-08-26 04:24:14

标签: stata

我有一组连续变量v1, v2, v3, v4偶尔会有负值,这意味着不适用。我想创建变量v5作为这些变量的整体表示,这些变量应排除负值,如下所示:

gen v5 = .
local locvar v1 v2 v3 v4  
replace v5 = (v1 + v2 + (v3/5) + (v4/5))/4.5 if `locvar' >= 0

但这不起作用。它说:invalid 'v2'我该如何修复它?

1 个答案:

答案 0 :(得分:1)

到目前为止,最好的长期解决方案是使用mvdecode将负值重新编码为缺失值。请注意,如果负值提供有关缺失原因或种类的信息,则可以使用扩展缺失值(.a.z)。否则,您将不得不为涉及这些变量的每个计算实施解决方法,以避免从字面上理解负值。

否则请注意,如果max(v1, 0)为负数,则0等表达式会返回v1,否则会返回v1

我忽略了将某些值除以5和总计4.5的详细信息,其中可能存在一个不是问题核心的逻辑。

以下是如何仅获得总值的总和。

gen total = max(v1, 0) + max(v2, 0) + max(v3, 0) + max(v4, 0)

以下是如何获得正值的计数。

gen count = (v1 > 0) + (v2 > 0) + (v3 > 0) + (v4 > 0)

当表达式为真时,Stata中的真或假评价为1,否则为0。

如果你有42个这样的变量,比方说,不是4,你应该更喜欢写一个循环:

gen total = 0 
gen count = 0 

quietly forval j = 1/42 { 
    replace total = total + max(v`j', 0) 
    replace count = count + (v`j' > 0) 
} 

等等。

如果缺少任何变量,max( 缺失 , 0)将返回0,但您需要一些条件,例如

v`j' > 0 & v`j' < . 

inrange(v`j', 0, .) 

抓住积极的(而不是失踪)。

注意:您猜测的解决方案无法修复。您必须处理每个变量以指定仅需要正值。如上所述,本地宏对任何循环都很有用。