【问题标题】:Plotting missing data绘制缺失数据
【发布时间】:2021-05-23 22:08:03
【问题描述】:

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

【问题讨论】:

  • 请阅读r标签页面顶部的信息,特别是使用dput显示您的输入,以便重现。

标签: r plot missing-data locf


【解决方案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)

【讨论】:

    【解决方案2】:

    这里有几个问题:

    • 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.approx 和 autoplot。如果您想要单独的面板,请省略 facet=NULL。

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

    注意

    我们在下面以可复制的形式提供数据。请注意,sex 列仅包含 NA 和 F,因此在没有方向的情况下,它将假定它们是逻辑 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-11-08
    • 2018-11-11
    • 2018-01-11
    • 2014-06-09
    • 1970-01-01
    • 2021-03-21
    • 2020-01-20
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多