【问题标题】:How can I isolate index segments based upon linearity using R如何使用 R 根据线性度隔离索引段
【发布时间】:2022-07-27 04:20:27
【问题描述】:

我有一个开始时间向量,用于在整个实验中执行的多个协议的单独扫描,我想根据每个扫描开始时间的线性来隔离协议。绘制向量可以清楚地表明哪些扫描是连续的,但我不确定如何根据开始时间的线性来分离每个协议。

starting_times = c(1518.280, 1523.622, 1529.188, 1534.527, 1539.858, 1545.006, 1550.458, 1555.838, 1561.153, 1566.463, 1571.848, 1577.106, 1582.271, 1587.658, 1592.874, 1598.086, 1603.334, 1608.481, 1613.953, 1619.115, 1673.661, 1695.512, 1716.557, 1856.711, 1866.470, 1869.777, 1873.147, 1886.839, 1890.145, 1893.404, 1896.853, 1900.199, 1903.585, 1921.432, 1931.714, 1937.140, 1942.540, 1947.849, 1953.022, 1958.291, 1963.643, 1968.793, 2008.844, 2020.818, 2029.011, 2044.400, 2053.175, 2077.344)

plot(starting_times)

  • 无论数据需要多少断点。每个协议都运行n 扫描,但不幸的是,每个协议的扫描次数没有设定标准。我希望我可以开发一种可靠的方法来根据扫描间隔分离每个协议,这将在协议中保持一致。这可以告诉我扫描是否是协议的一部分,以及新协议是否已经开始。
  • 是的,下面的方法很实用。
  • 谢谢你的帮助!我将尝试应用一些其他变量,并使下面显示的方法成为整个排序过程的一个元素。
  • 嗨,又是我。我正在开发希望可以解决这个问题的统计方法。我对你的数据很感兴趣。我们有可能合作吗?
  • 我认为这是可能的。你希望我如何贡献。我可以提供类似于我之前向您展示的数据。

标签: r linear-regression


【解决方案1】:

在这个例子中,哪些点属于哪个扫描并不那么明显。我猜有 6 个集群,但最后一点与最后一个集群不太吻合,几乎看起来像是下一个集群的开始。

要根据它们与前一点的线性拟合程度来标记所有点,您可以定义如下函数:

groupify <- function(x, threshold = 10) {

  for(i in seq(length(x) - 1)) {
    if(i == 1) {
      group <- 1
      last_grad <- diff(x)[i]
      new_group <- FALSE
      next
    }
    if((abs(diff(x)[i] - last_grad) < threshold) | new_group) {
      group <- c(group, tail(group, 1))
      new_group <- FALSE
    }  else {
      group <- c(group, tail(group, 1) + 1)
      new_group <- TRUE
    }
    last_grad <- diff(x)[i]
  }

  setNames(data.frame(seq_along(x), x, factor(c(1, group))),
           c("index", deparse(substitute(x)), "group"))
}

我们可以通过在 ggplot 中绘制集群来测试这一点:

library(ggplot2)

ggplot(groupify(starting_times), 
       aes(index, starting_times, color = group)) +
  geom_point()

您可以看到它已将所有点正确识别到正确的扫描中(可能除了最后一个点,因为它与前面的序列对齐不佳)。您可以使用阈值来检测更多或更少的组,但最后一点总是一个异常值 - 这里的梯度变化比一些明显扫描之间的变化更大,因此您可能需要手动重新标记它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多