Stata 生成新变量时忽略缺少的值
我想在Stata中创建一个新变量,它是Stata 生成新变量时忽略缺少的值,stata,Stata,我想在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 g
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()
可能会起作用
编辑: 为了澄清,“忽略缺失变量”意味着即使任何一个组件变量没有缺失,也只对该变量应用函数,并为新变量生成一个值。只有当三个组件变量都缺失时,新变量才应具有缺失值 我猜“忽略缺失值”意味着“将它们视为零”。如果你有其他想法,你应该把它说清楚 那可能是
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。即使xyz
都没有缺失,它的计算结果也会是1/7。这离你想要的总数还有很长的路要走missing()
(max(X, Y, Z)/7) if missing(X , Y, Z)
当且仅当其中一个值未缺失,而另两个值缺失时,X
、Y
、Z
的最大值才是正确答案max()
尽可能忽略缺失(即使在其他上下文中,缺失被视为任意大的正数) 我猜“忽略缺失值”意味着“将它们视为零”。如果你有其他想法,你应该把它说清楚
那可能是
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。即使xyz
都没有缺失,它的计算结果也会是1/7。这离你想要的总数还有很长的路要走missing()
(max(X, Y, Z)/7) if missing(X , Y, Z)
当且仅当其中一个值未缺失,而另两个值缺失时,X
、Y
、Z
的最大值才是正确答案max()
尽可能忽略缺失(即使在其他上下文中,缺失被视为任意大的正数) 如果您只想“忽略缺少的值”,而不想“将其视为零”,那么以下操作将起作用:
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)
如果您只想“忽略缺少的值”,而不想“将其视为零”,则以下操作将起作用:
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)
egen
通常允许非常复杂的参数。这里的限制特定于只接受varlist的rowtall()
。欢迎使用堆栈溢出。最好提供一些示例数据和预期输出。这将最大限度地增加你得到有用答案的机会。有关如何改进未来问题的提示,请阅读。egen
通常允许非常复杂的参数。这里的限制特定于只接受varlist的rowtall()
。欢迎使用堆栈溢出。最好提供一些示例数据和预期输出。这将最大限度地增加你得到有用答案的机会。有关如何改进未来问题的提示,请阅读。谢谢Pearly。问题是,即使至少有一个观测值没有丢失,新var中仍然缺少值。例如,如果X缺失,我希望新的var为Y和Z中的值运行函数,并生成一个值,而不是认为它缺失。只有当所有三个X Y Z都缺失时,新的var才应具有缺失的值。您对如何实现这一点有什么建议吗?可以通过使用@NickCox答案中的第一个命令来实现(如果它解决了您的问题,您也应该接受使用复选标记)。它有建议,只是它将缺少的值视为零。我想我可以添加一个替换命令来将它们更改为missing。谢谢Pearly。问题是,即使至少有一个观测值没有丢失,新var中仍然缺少值。例如,如果X缺失,我希望新的var为Y和Z中的值运行函数,并生成一个值,而不是认为它缺失。只有当所有三个X Y Z都缺失时,新的var才应具有缺失的值。您对如何实现这一点有什么建议吗?可以通过使用@NickCox答案中的第一个命令来实现(如果它解决了您的问题,您也应该接受使用复选标记)。它有建议,只是它将缺少的值视为零。我想我可以添加一个replace命令来更改它们