我想在Stata中创建一个新变量,它是3
,X
,Y
和Z
等不同变量的函数,例如:
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()
可以工作。
编辑:
为澄清起见,“忽略缺少的变量”表示即使没有任何一个组件变量,也应仅将函数应用于该变量并为新变量生成一个值。仅当所有三个组成变量都缺失时,新变量才应具有缺失值。
答案 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
也将会丢失。相同的注释适用于涉及Y
和Z
的术语。因此,您将所有缺失值替换为缺失值,这毫无益处。
!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)
当且仅当其中一个值未丢失而其他两个值均丢失时,X
,Y
,Z
中的最大值才是正确的答案。 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)