【问题标题】:Ignore missing values when generating new variable生成新变量时忽略缺失值
【发布时间】:2019-02-23 13:44:40
【问题描述】:

我想在Stata中新建一个变量,即3不同变量的函数,XYZ,比如:

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() 可以工作。


编辑:

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

【问题讨论】:

  • egen 通常允许相当复杂的参数。这里的限制特定于 rowtotal(),它只需要一个 varlist
  • 欢迎来到 Stack Overflow。最好提供一些示例数据和预期的输出。这将最大限度地提高您获得有用答案的机会。有关如何改进未来问题的提示,请阅读How to create high quality reproducible examples in Stata

标签: stata


【解决方案1】:

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

可能是

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() 尽可能忽略缺失(即使在其他上下文中缺失被视为任意大的正数)。

【讨论】:

  • 谢谢尼克。我对 Stata 很陌生,所以您的所有解释对于理解命令背后的机制非常有帮助。我在不同的组中搜索与我类似的查询并尝试那里建议的命令,但不了解它们背​​后的逻辑。在此计算中,我不想将缺失值视为零。仅当所有三个组件变量都缺失时,新变量才应具有缺失值。如果其中任何一个没有丢失,则该函数应仅应用于该变量以计算新值。
  • 谢谢尼克和珀莉。我将使用第一个命令和一个额外的替换命令将所有零转换为缺失值。
  • 计算看起来很奇怪,但那是你的一面。 replace new_var = . if missing(X) & missing(Y) & missing(Z) 似乎是一种做你想做的事的方式。
【解决方案2】:

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

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) 

【讨论】:

  • 谢谢珀莉。问题是即使没有丢失至少一个观察值,新 var 中仍然存在缺失值。例如,如果 X 丢失,我希望新 var 为 Y 和 Z 中的值运行函数并生成一个值,而不是认为它丢失了。仅当所有三个 X Y Z 都缺失时,新 var 才应具有缺失值。您对如何实现这一点有什么建议吗?
  • 这可以通过使用@NickCox 答案中的第一个命令来实现(如果它解决了您的问题,您也应该使用复选标记接受)。
  • 确实如此,只是它将缺失值视为零。我想我可以添加一个替换命令将它们更改为缺失。
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 2020-08-11
  • 2013-05-21
  • 2020-11-25
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多