我有一组连续变量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'
我该如何修复它?
答案 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, .)
抓住积极的(而不是失踪)。
注意:您猜测的解决方案无法修复。您必须处理每个变量以指定仅需要正值。如上所述,本地宏对任何循环都很有用。