使用dplyr的线性插值

sla*_*ine 5 r xts 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)
Run Code Online (Sandbox Code Playgroud)

我可以使用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
Run Code Online (Sandbox Code Playgroud)

返回矩阵并不理想,但我可以解决这个问题.我遇到的主要问题是我有多个人的多个结果.我,或许天真地认为,因为这是一个分裂 - 应用 - 组合问题,我可以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
Run Code Online (Sandbox Code Playgroud)

似乎dplyrxts/ zoo不合适我花了几个小时搜索试图找到关于如何在R中插入缺失数据点的教程/示例,但我发现的只是单个案例并且到目前为止我一直无法找到任何关于如何为多个人的多个站点执行此操作的任何内容(我意识到我可以通过将我的数据重新调整为宽泛而使其成为多人问题,但仍然无法解决我遇到的问题).

任何有关如何进行的想法/建议/见解将不胜感激.

谢谢

编辑:澄清一些功能来自zoo包.

sla*_*ine 7

我带走的解决方案基于@docendodiscimus的第一条评论

而不是试图创建一个新的数据帧,我一直在做这种方法只需趁着添加到现有的数据帧列dplyrmutate()功能.

我的代码现在......

df %>%
  group_by(variable) %>%
    arrange(variable, event.date) %>%
      mutate(ip.value = na.approx(value, maxgap = 4, rule = 2))
Run Code Online (Sandbox Code Playgroud)

maxgap允许高达四个连续NA的,而rule选项允许外推到侧翼的时间点.


sum*_*txt 6

使用该approx()函数进行线性插值:

df %>%
  group_by(variable) %>%
    arrange(variable, event.date) %>%
    mutate(time=seq(1,n())) %>%
      mutate(ip.value=approx(time,value,time)$y) %>%
      select(-time)
Run Code Online (Sandbox Code Playgroud)

spline用于非线性插值的函数:

df %>%
  group_by(variable) %>%
    arrange(variable, event.date) %>%
    mutate(time=seq(1,n())) %>%
      mutate(ip.value=spline(time,value ,n=n())$y) %>%
      select(-time)
Run Code Online (Sandbox Code Playgroud)