【问题标题】:Testing for missing values in R测试 R 中的缺失值
【发布时间】:2017-06-24 02:26:03
【问题描述】:

我有一个时间序列数据集,其中有一些缺失值。我希望对缺失值进行估算,但我不确定哪种方法最合适,例如 imputeTS 包中的线性、样条或斜线。

为了完整起见,我希望测试我的数据是 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"

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

【问题讨论】:

  • 尝试将wideRawDF[sapply(wideRawDF, function(x) any(is.na(x)))] 传递给TestMCARNormality()。应该只包含缺少值的列。
  • 嗨,Simon,感谢您的反馈,请将其放入答案中,我可以将其标记为已修复。谢谢
  • 完成。谢谢,很高兴它成功了!

标签: r missing-data imputation imputets


【解决方案1】:

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

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]) 的一个子集,它吐回 Warning: 2 Cases with all variables missing have been removed from the data. Warning: More than one missing data pattern should be present. 如果你有任何想法我很想听听,谢谢。
  • @Simon Jackson,不用担心,经过更多挖掘后,我发现了一个 SOpost,关于如何查找带有 NA 的列。再次感谢您的帮助。
【解决方案2】:

事实证明,问题在于 TestMCARNormality 中的默认设置,即缺失模式必须具有多少个案例才能将其包含在分析中。有问题的选项是“del.lesscases”,默认情况下设置为 6。这意味着它将删除任何丢失的数据模式,而不是 6 或更少的情况。除了您的数据中第一个缺失的模式包含完整的数据外,每个模式的事例不超过 3 个,默认情况下全部删除。因此,TestMCARNormality 会给出您需要超过 1 个缺失数据模式的错误,这是正确的。如果您设置 del.lesscases = 2,那么它将保留至少 3 个案例的所有缺失模式,如果设置为 del.lesscases = 1,它将保留至少 2 个案例的所有模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多