生成新变量时忽略缺失值

时间:2019-02-23 13:44:41

标签: stata

我想在Stata中创建一个新变量,它是3XYZ等不同变量的函数,例如:

gen new_var = (((X)*3) + ((Y)*2) + ((Z)*4))/7

所有观测值都缺少一个或两个变量的值。

当我运行上述命令时,它生成的所有值都是缺失值,因为没有观察到所有3变量的值。我希望Stata忽略丢失的变量来完成功能。

我尝试了以下命令,但没有成功:

gen new_var= (cond(missing(X*3),., X) + cond(missing(Y*2),., Y))/7 
gen new_var= (!missing(X*3+Y*2+Z*4)/7)
gen new_var=  (max(X , Y, Z)/7) if missing(X , Y, Z) 

egen命令不允许使用复杂的功能;否则rowtotal()可以工作。


编辑:

为澄清起见,“忽略缺少的变量”表示即使没有任何一个组件变量,也应仅将函数应用于该变量并为新变量生成一个值。仅当所有三个组成变量都缺失时,新变量才应具有缺失值。

2 个答案:

答案 0 :(得分:2)

我将猜测“忽略缺失值”意味着“将它们视为零”。如果您有其他想法,则应明确表达。

可能是

gen new_var = (cond(missing(X), 0, 3 * X) ///
+ cond(missing(Y), 0, 2 * Y) ///
+ cond(missing(Z), 0, 4 * Z)) / 7 

让我们看看您的解决方案,并解释为什么它们通常或通常都是错误的。

(cond(missing(X*3),., X) + cond(missing(Y*2),., Y))/7 

请注意,如果确实缺少X,那么cond()也会丢失,因为X * 3也将会丢失。相同的注释适用于涉及YZ的术语。因此,您将所有缺失值替换为缺失值,这毫无益处。

!missing(X*3+Y*2+Z*4)/7

鉴于以下信息:X Y Z中至少有一个始终丢失,因此该值始终为0/7或0。即使X Y Z都为非缺失值,也将其值为1。 / 7。距离您想要的总和还有很长的路要走。 missing()始终产生1或0,其否定为0或1。

(max(X, Y, Z)/7) if missing(X , Y, Z) 

当且仅当其中一个值未丢失而其他两个值均丢失时,XYZ中的最大值才是正确的答案。 max()尽可能地忽略缺失(即使在其他情况下,缺失也被视为任意大的正数)。

答案 1 :(得分:1)

如果您只想“忽略缺失的值”而不是“将它们视为零”,那么以下方法将起作用:

clear
set obs 10

generate X = rnormal(5, 2)
generate Y = rnormal(10, 5)
generate Z = rnormal(1, 10)

replace X = . in 2
replace Y = . in 5
replace Z = . in 9

generate new_var = (((X)*3) + ((Y)*2) + ((Z)*4)) / 7 if X != . | Y != . | Z != .

list

     +---------------------------------------------+
     |        X          Y           Z     new_var |
     |---------------------------------------------|
  1. | 3.651024    3.48609    -24.1695   -11.25039 |
  2. |        .   14.14995    8.232919           . |
  3. | 3.689442   9.812483    1.154064    5.044221 |
  4. | 2.500493   13.02909     5.25539    7.797317 |
  5. |  4.19431          .    6.584174           . |
  6. | 7.221717   13.92533    5.045283    9.956708 |
  7. | 5.746871   14.26329    3.828253    8.725744 |
  8. | 1.396223    16.2358    19.01479    16.10277 |
  9. | 4.633088   13.95751           .           . |
 10. | 2.521546   4.490258   -3.396854     .422534 |
     +---------------------------------------------+

或者,您也可以使用inlist()函数:

generate new_var = (((X)*3) + ((Y)*2) + ((Z)*4)) / 7 if !inlist(., X, Y, Z)