如何使用 seqtime 在 R 中的组内插入数据?

how to interpolate data within groups in R using seqtime?

我正在尝试使用 seqtime (https://github.com/hallucigenia-sparsa/seqtime) 来分析时间序列微生物组数据,如下所示:

meta = data.table::data.table(day=rep(c(15:27),each=3), condition =c("a","b","c"))
meta<- meta[order(meta$day, meta$condition),]
meta.ts<-as.data.frame(t(meta))
otu=matrix(1:390, ncol = 39)
oturar<-rarefyFilter(otu, min=0)
rarotu<-oturar$rar
time<-meta.ts[1,]

interp.otu<-interpolate(rarotu, time.vector = time, 
                      method = "stineman", groups = meta$condition)

插值returns出现如下错误:

[1] "Processing group a"
[1] "Number of members 13"
intervals
 0 
12 
[1] "Selected interval: 1"
[1] "Length of time series: 13"
[1] "Length of time series after interpolation: 1"
Error in stinepack::stinterp(time.vector, as.numeric(x[i, ]), xout = xout,  : 
  The values of x must strictly increasing

我试图将方法更改为 "hyman",但 returns 出现以下错误:

  Error in interpolateSub(x = x, time.vector = time.vector, method = method) : 
      Time points must be provided in chronological order.

我正在使用 R 版本 3.6.1,我对 R 有点陌生。

谁能告诉我我做错了什么/如何解决这些错误? 非常感谢!

我花了很多时间摸索着想弄明白这个问题。这一切都归结为 meta 的数据结构和用作 time.vector 参数输入的结果时间变量。

meta.ts 被转换为数据框时,所有字符串都会自动转换为因子 - 这包括 day

要进行调整,您可以将代码编辑为以下内容:

library(seqtime)

meta <- data.table::data.table(day=rep(c(15:27),each=3), condition =c("a","b","c"))
meta <- meta[order(meta$day, meta$condition),]
meta.ts <- as.data.frame(t(meta), stringsAsFactors = FALSE) # Set stringsAsFactors = FALSE
otu <- matrix(1:390, ncol = 39)
oturar <- rarefyFilter(otu, min=0)
rarotu <- oturar$rar
time <- as.integer(meta.ts[1,]) # Now 'day' is character, so convert to integer

interp.otu <- interpolate(rarotu, time.vector = time, 
                        method = "stineman", groups = meta$condition)

作为奖励,请阅读 this 博文以获取有关 stringsAsFactors 参数的信息。字符串自动转换为因子是一种常见的困惑。