缺失值的处理

Handling of missing values

考虑以下玩具示例:

. clear
. set obs 10

. generate double random = runiform()

. generate foo = 1
. replace  foo = . if random < 0.50

. generate foo_sum = sum(foo)

. list random foo foo_sum

    +---------------------------+
    |    random   foo   foo_sum |
    |---------------------------|
 1. | .06692297     .         0 |
 2. | .85529108     1         1 |
 3. | .35454616     .         1 |
 4. |  .4995136     .         1 |
 5. | .53638222     1         2 |
    |---------------------------|
 6. | .84661429     1         3 |
 7. | .15198199     .         3 |
 8. | .33054815     .         3 |
 9. | .06141655     .         3 |
10. | .01555962     .         3 |
    +---------------------------+

给定变量 foo 中的缺失值,结果是 foo_sum错了?

简而言之,没有。

结果来自 Stata 处理缺失观察的事实 与预期不同。

foo_sum 中的结果可以描述为反直觉 因为:

. display .
.

. display . + 1
.

但是:

. display sum(.)
0

. display sum(. + 1)
0

那么这里到底发生了什么?

好吧,在这种情况下,Stata 似乎将缺失值视为零。

另一个例子:

. generate foo_max = max(foo, foo_sum)

. list

    +-------------------------------------+
    |    random   foo   foo_sum   foo_max |
    |-------------------------------------|
 1. | .06692297     .         0         0 |
 2. | .85529108     1         1         1 |
 3. | .35454616     .         1         1 |
 4. |  .4995136     .         1         1 |
 5. | .53638222     1         2         2 |
    |-------------------------------------|
 6. | .84661429     1         3         3 |
 7. | .15198199     .         3         3 |
 8. | .33054815     .         3         3 |
 9. | .06141655     .         3         3 |
10. | .01555962     .         3         3 |
    +-------------------------------------+

鉴于 Stata 中的缺失值通常被视为 正无穷大, 在这种情况下,期望值是 . 而不是 03 在观察 1 中说 7

看起来 Stata 只是忽略了缺失值!

以上例子说明了我最近的一个相当令人惊讶的发现 在编程时,我想我应该在这里分享。