Линейная интерполяция с использованием dplyr
Я пытаюсь использоватьna.approx()
функция отzoo
библиотека (совместно сxts
) интерполировать пропущенные значения из данных повторных измерений для нескольких лиц с несколькими измерениями.
Пример данных...
event.date <- c("2010-05-25", "2010-09-10", "2011-05-13", "2012-03-28", "2013-03-07",
"2014-02-13", "2010-06-11", "2010-09-10", "2011-05-13", "2012-03-28",
"2013-03-07", "2014-02-13")
variable <- c("neck.bmd", "neck.bmd", "neck.bmd", "neck.bmd", "neck.bmd", "neck.bmd",
"wbody.bmd", "wbody.bmd", "wbody.bmd", "wbody.bmd", "wbody.bmd", "wbody.bmd")
value <- c(0.7490, 0.7615, 0.7900, 0.7730, NA, 0.7420, 1.0520, 1.0665, 1.0760,
1.0870, NA, 1.0550)
## Bind into a data frame
df <- data.frame(event.date, variable, value)
rm(event.date, variable, value)
## Convert date
df$event.date <- as.Date(df$event.date)
## Load libraries
library(magrittr)
library(xts)
library(zoo)
Я могу интерполировать одну отсутствующую точку данных для одного результата для данного человека, используяxts()
а такжеna.approx()
....
## Subset one variable
wbody <- subset(df, variable == "wbody.bmd")
## order/index and then interpolate
xts(wbody$value, wbody$event.date) %>%
na.approx()
2010-06-11 1.052000
2010-09-10 1.066500
2011-05-13 1.076000
2012-03-28 1.087000
2013-03-07 1.070977
2014-02-13 1.055000
Не идеально возвращать матрицу, но я могу обойти это. Однако главная проблема, которую я имею, заключается в том, что у меня несколько результатов для нескольких людей. Я, возможно, наивно думал, что, поскольку это, следовательно, проблема разделения-применения-объединения, которую я мог бы использоватьdplyr
добиться этого следующим образом ...
## Load library
library(dplyr)
## group and then arrange the data (to ensure dates are correct)
df %>%
group_by(variable) %>%
arrange(variable, event.date) %>%
xts(.$value, .$event.date) %>%
na.approx()
Error in xts(., .$value, .$event.date) :
order.by requires an appropriate time-based object
Кажется, чтоdplyr
плохо играет сxts
/zoo
и я потратил пару часов, пытаясь найти уроки / примеры того, как интерполировать пропущенные точки данных в R, но все, что я нашел, это примеры из одного случая, и до сих пор я не смог ничего найти о том, как сделать это для нескольких сайтов для нескольких людей (я понимаю, что я мог бы сделать это просто проблемой для нескольких людей, изменив свои данные в широкие, но это все равно не решило бы проблему, с которой я столкнулся).
Любые мысли / советы / идеи о том, как действовать, будет принята с благодарностью.
Спасибо
РЕДАКТИРОВАТЬ: разъяснение, что некоторые функции берутсяzoo
пакет.