【问题标题】:Fast way to determine which datapoints lay above a predefined multisegmented line?确定哪些数据点位于预定义的多段线上方的快速方法?
【发布时间】:2021-11-25 12:31:52
【问题描述】:

我需要扫描近一百万个数据点并确定它们是低于还是高于阈值。我有全局定义的阈值,我有一个简单的预定义函数

function.lower.penalty <- function(i,j){   if( i < j ){
    #if gate condition is met, flip the gate flag:
    n <- 1   }else{n<-0}   return(n) }

我用 mapply 调用,它将在我的数据框中写入一个 0/​​1 标志列:

df[, paste0("outside.highpass")]  <- mapply(function.lower.penalty,i="somesignal.found.in.df", j="*some.threshold.found.in.df*"  ) 

这非常简单,我可以在第二个大数据帧中标记数十个信号及其各自的阈值。此外,考虑到阈值的编写方式,代码会将信号标记为低于/高于阈值(这意味着我还有一个 function.higher.penalty)。

现在我被要求制作一个具有多段线形状的更复杂的阈值。 鉴于您只有多段线的角点(我可以根据它们绘制线的方式猜测它们)可见here,因此标记数据点的最快方法是什么。

到目前为止,我有一个预定义的阈值(灰色 0.2)并使用 mapply 扫描在 x 轴上绘制的信号。如果数据点小于或大于阈值,我只是使用函数返回 0 或 1。现在我需要一条多段线,比如用红色绘制的那条线来完成同样的工作。

编辑:使用 det 的建议,我能够在数据框中标记数据点。但是,似乎某些靠近定义线的数据点被错误地分配,请参阅here。我想知道如何解决它或者这是一个绘图错误?

【问题讨论】:

    标签: r mapply


    【解决方案1】:

    您可以创建基于点返回 picewise 线性函数的函数:

    picewiseLinear <- function(x.var, y.var){
      
      stopifnot(length(x.var) == length(y.var), sum(duplicated(x.var)) == 0)
      
      p <- order(x.var)
      x.var <- x.var[p]
      y.var <- y.var[p]
      
      k <- diff(y.var) / diff(x.var)
      l <- -1 * k * head(x.var, -1) + head(y.var, -1)
      
      function(x){
        
        ind <- findInterval(x, x.var)
        if(!all(between(ind, 1, length(x.var) - 1))) stop("wrong input")
        
        x * k[ind] + l[ind]
      }
    }
    

    例如:

    point_df <- tribble(
      ~x, ~y,
      3,  0,
      5,  2,
      3,  3,
      5,  4
    )
    
    f <- picewiseLinear(point_df$y, point_df$x)
    

    (在您的图片上,您有 picewise 线性函数,但将 x 视为因变量)

    在示例数据集上,您会得到如下内容:

    set.seed(123)
    tibble(
      x = runif(1000, 0, 6),
      y = runif(1000, 0, 4)
    ) %>%
      mutate(color = ifelse(x > f(y), "red", "blue")) %>%
      ggplot(aes(x, y)) + 
        geom_point(aes(color = color)) +
        scale_color_identity() +
        geom_path(data = point_df)
    

    【讨论】:

    • 非常感谢您的回答!我设法对其进行了调整,而不是着色,而是创建了一个具有相应子集编号的列。但是,如果我绘制了两个子集,我意识到靠近多段线的一些点似乎被错误地标记了。请参阅我在编辑中添加的图片。我不确定这是否是绘图错误。
    • 可能与您在绘图上有对数刻度的事实有关。尝试使用正常比例(如果需要更好地检查这些区域的子集数据)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2021-03-14
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多