Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stata 生成新变量时忽略缺少的值_Stata - Fatal编程技术网

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

我想在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()
可能会起作用


编辑:

为了澄清,“忽略缺失变量”意味着即使任何一个组件变量没有缺失,也只对该变量应用函数,并为新变量生成一个值。只有当三个组件变量都缺失时,新变量才应具有缺失值

我猜“忽略缺失值”意味着“将它们视为零”。如果你有其他想法,你应该把它说清楚

那可能是

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命令来更改它们