绘制缺失数据

Plotting missing data

我正在尝试根据此过程使用 LOCF 方法绘制以下估算数据集

> dati
# A tibble: 27 x 6
      id sex      d8   d10   d12   d14
   <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
 1     1 F      21    20    21.5  23  
 2     2 F      21    21.5  24    25.5
 3     3 NA     NA    24    NA    26  
 4     4 F      23.5  24.5  25    26.5
 5     5 F      21.5  23    22.5  23.5
 6     6 F      20    21    21    22.5
 7     7 F      21.5  22.5  23    25  
 8     8 F      23    23    23.5  24  
 9     9 F      NA    21    NA    21.5
10    10 F      16.5  19    19    19.5
# ... with 17 more rows

dati_locf <- dati %>% mutate(across(everything(),na.locf)) %>%
  mutate(across(everything(),na.locf,fromlast = T))

apply(dati_locf[which(dati_locf$sex=="F"),1:4], 1, function(x) lines(x, col = "green"))

然而,当我 运行 最后一行绘制数据集时,它让我返回这些错误和警告消息:

Warning in xy.coords(x, y) : a NA has been produced by coercion
Error in plot.xy(xy.coords(x, y), type = type, ...) : 
  plot.new has not been called yet
Called from: plot.xy(xy.coords(x, y), type = type, ...)

你能解释一下为什么以及我如何修复它们吗?我让您在 运行 之后附上我一直在处理的页面。 enter image description here

这里有几个问题:

  • apply 会将它的第一个参数转换为矩阵,因为第二列是字符,所以它给出了一个字符矩阵。显然不能用 lines.
  • 来绘制
  • 大概我们想要绘制列 3:6,而不是 1:4
  • na.locf 将产生多个相同的值,只要有 NA,但我们真正想要的是连接非 NA 点。请改用 na.approx
  • lines只能在plot之后使用,但没有plot命令。请改用 matplot

进行这些更改,我们有以下内容。

library(zoo)
# see Note below for dati in reproducible form
matplot(na.approx(dati[3:6]), type = "l", ylab = "")
legend("topright", names(dati)[3:6], col = 1:4, lty = 1:4)

(剧情后续)

我们可以交替使用 ggplot2 图形。首先转换为 zoo,然后使用 na.approxautoplot。如果您想要单独的面板,请省略 facet=NULL

library(ggplot2)
autoplot(na.approx(zoo(dati[3:6])), facet = NULL)

备注

我们在下面以可复制的形式提供数据。请注意,sex 列仅包含 NAF,因此在没有方向的情况下,它将假定它们是逻辑 NA 和 FALSE。相反,我们指定 sex 列是 read.table 行中的字符。

Lines <- "
      id sex      d8   d10   d12   d14
 1     1 F      21    20    21.5  23  
 2     2 F      21    21.5  24    25.5
 3     3 NA     NA    24    NA    26  
 4     4 F      23.5  24.5  25    26.5
 5     5 F      21.5  23    22.5  23.5
 6     6 F      20    21    21    22.5
 7     7 F      21.5  22.5  23    25  
 8     8 F      23    23    23.5  24  
 9     9 F      NA    21    NA    21.5
10    10 F      16.5  19    19    19.5"
dati <- read.table(text = Lines, colClasses = list(sex = "character"))

如果您只想绘制一个变量的 LOCF 插补以查看插补对这一变量的拟合程度,您可以使用以下方法:

library(imputeTS)
# Example 1: Visualize imputation by LOCF
imp_locf <- na_locf(tsAirgap)
ggplot_na_imputations(tsAirgap, imp_locf)

tsAirgap 是时间序列示例,imputeTS 包自带。您必须将其替换为您想要绘制的时间序列/变量。估算值以红色显示。如您所见,对于这个系列,最后的观察结转可能还不错,但是 imputeTS 包附带了一些算法,可以提供更好的结果(例如 na_kalman 或 na_seadec)。这也是下一次观察的一个例子,因为你也使用了 NOCB。

library(imputeTS)
# Example 2: Visualize imputation by NOCB
imp_locf <- na_locf(tsAirgap, option = "nocb")
ggplot_na_imputations(tsAirgap, imp_locf)