在R中测试缺失值

5

我有一个时间序列数据集,其中有些值是缺失的。我希望填充缺失值,但不确定哪种方法是最合适的,比如线性、样条或来自imputeTS包的stine。

为了完整起见,我希望测试我的数据是MCAR、MAR还是NMAR。我有一个相当好的想法它是MCAR的,但我对进行测试感兴趣。

str(wideRawDF)
'data.frame':   1343 obs. of  13 variables:
 $ Period.Start.Time: POSIXct, format: "2017-01-20 16:30:00" "2017-01-20 16:45:00" "2017-01-20 17:00:00" "2017-01-20 17:15:00" ...
 $ DO0182U09A3      : num  -102 -101 -101 -101 -101 ...
 $ DO0182U09B3      : num  -103.4 -102.8 -103.3 -95.9 -103 ...
 $ DO0182U09C3      : num  -103.9 -104.2 -103.9 -99.2 -104.1 ...
 $ DO0182U21A1      : num  -105 -105 -105 -104 -102 ...
 $ DO0182U21A2      : num  -105 -104 -105 -105 -105 ...
 $ DO0182U21A3      : num  -105 -105 -105 -105 -105 ...
 $ DO0182U21B1      : num  -102 -103 -104 -104 -104 ...
 $ DO0182U21B2      : num  -99.4 -102 -104 -101.4 -104.1 ...
 $ DO0182U21B3      : num  -104 -104 -104 -104 -104 ...
 $ DO0182U21C1      : num  -105 -105 -105 -104 -105 ...
 $ DO0182U21C2      : num  -104 -105 -105 -103 -105 ...
 $ DO0182U21C3      : num  -105 -105 -105 -105 -105 ...

md.pattern(wideRawDF)
     Period.Start.Time DO0182U21C1 DO0182U21C2 DO0182U21C3 DO0182U21B1 DO0182U21B2 DO0182U21B3 DO0182U09A3 DO0182U09B3 DO0182U09C3 DO0182U21A1 DO0182U21A2
1327                 1           1           1           1           1           1           1           1           1           1           1           1
   3                 1           1           1           1           1           1           1           0           1           1           1           1
   1                 1           1           1           1           1           1           1           1           0           1           1           1
   2                 1           1           1           1           1           1           1           1           1           0           1           1
   1                 1           1           1           1           1           1           1           0           1           1           0           0
   1                 1           1           1           1           1           1           1           0           0           1           0           0
   3                 1           1           1           1           1           1           1           1           0           0           0           0
   2                 1           1           1           1           1           1           1           0           0           0           0           0
   3                 1           1           1           1           0           0           0           1           0           0           0           0
                     0           0           0           0           3           3           3           7          10          10          10          10
     DO0182U21A3   
1327           1  0
   3           1  1
   1           1  1
   2           1  1
   1           0  4
   1           0  5
   3           0  5
   2           0  6
   3           0  8
              10 66

您可以看到,我DF中的某些列没有NA值。我希望将只有NA值的列传递给MissMech软件包中的TestMCARNormality函数。

我尝试了以下操作,但仍然遇到同样的错误:

> TestMCARNormality(wideRawDF[,3:4])
Warning: 8 Cases with all variables missing have been removed 

          from the data.
Warning: More than one missing data pattern should be present. 

使用colnames函数,我得到了与上述md.pattern输出相对应的列索引,以确保我使用有NA值的列。
> colnames(wideRawDF)
 [1] "Period.Start.Time" "DO0182U09A3"       "DO0182U09B3"       "DO0182U09C3"       "DO0182U21A1"       "DO0182U21A2"       "DO0182U21A3"       "DO0182U21B1"      
 [9] "DO0182U21B2"       "DO0182U21B3"       "DO0182U21C1"       "DO0182U21C2"       "DO0182U21C3"

什么是测试缺失值的聪明方式,并将仅带有NAs的列传递给TestMCARNormality函数的方法?

1
尝试将 wideRawDF[sapply(wideRawDF, function(x) any(is.na(x)))] 传递给 TestMCARNormality()。只应包括具有缺失值的列。 - Simon Jackson
1
嗨Simon,感谢你的反馈,请将它放在一个回答中,我可以标记为已修复。谢谢。 - TheGoat
完成。谢谢,很高兴它起作用了! - Simon Jackson
2个回答

3

根据评论,您可以使用以下内容:

has_na <- sapply(wideRawDF, function(x) any(is.na(x)))
TestMCARNormality(wideRawDF[has_na])

has_na 是一个布尔向量,对应于 wideRawDF 的每一列。如果某列中至少有一个缺失值,则该列的值为 TRUE。

因此,wideRawDF[has_na] 是您的数据框 wideRawDF,但只包含具有缺失值的列。


我尝试了上面的代码并在将我的has_na传递给TestMCARNormality时遇到了错误。经过一番查找,我发现TestMCARNormality需要一个由至少两列组成的矩阵或数据框,因此传递布尔向量是行不通的。我尝试传递wideRawDF的子集(wideRawDF [,2:7]),但它返回警告:“警告:已删除具有所有变量缺失的2个案例。”, “警告:应该存在多个缺失数据模式。” 如果你有任何想法,我很乐意听取,谢谢。 - TheGoat
@ Simon Jackson,不用担心,经过更深入的挖掘,我找到了一个有关如何查找带有NA值的列的SO 帖子。再次感谢您的帮助。 - TheGoat

0
原来问题出在TestMCARNormality的默认设置上,关于缺失模式必须具有的案例数以便将其包含在分析中。所涉及的选项是“del.lesscases”,默认设置为6。这意味着它将删除任何具有6个或更少案例的缺失数据模式。除了您的数据中的第一个缺失模式(其中包含完整数据)之外,每个模式最多只有3个案例,所有这些案例都会被默认删除。因此,TestMCARNormality会给出您需要超过1个缺失数据模式的错误,这是正确的。如果您将del.lesscases设置为2,则它将保留至少具有3个案例的所有缺失模式,如果设置为del.lesscases = 1,则它将保留至少具有2个案例的所有模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接