0

根据此过程,我正在尝试使用 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, ...)

你能解释一下为什么以及如何修复它们吗?我让你在运行它后附上我一直在寻址的页面。 在此处输入图像描述

4

2 回答 2

1

这里有几个问题:

  • 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.approxand autoplotfacet=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"))
于 2021-02-21T13:49:01.883 回答
1

如果您只想绘制一个变量的 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)

在此处输入图像描述

于 2021-03-03T22:45:32.070 回答