绘制缺失数据
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.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"))
如果您只想绘制一个变量的 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)
我正在尝试根据此过程使用 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.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"))
如果您只想绘制一个变量的 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)