【问题标题】:R: Single Cell tracking X and Y coordinates (Position) changes during time courseR:单细胞跟踪 X 和 Y 坐标(位置)在时间过程中的变化
【发布时间】:2018-06-10 22:56:56
【问题描述】:

我有两个数据帧(1 分钟时间点和 26 分钟时间点)。

我有 PosX 和 PosY(在特定时间点检测到的所有细胞的图像中的 X 和 Y 位置)和我感兴趣的读数

随着时间的推移,细胞会轻微迁移。我使用以下方法计算了 X 和 Y(delta_x 和 delta_y)的偏移:

delta_x <-  median_x_0nM_26min - median_x_0nM_1min 
delta_y <-  median_y_0nM_26min - median_y_0nM_1min 

然后我将此更改添加到我的起始 X 和 Y 值

Xmax <- DF_1min$PosX + delta_x
Xmin <- DF_1min$PosX - delta_x
Ymax <- DF_1min$PosY + delta_Y
Ymin <- DF_1min$PosY - delta_Y

DF_1min <- cbind(DF_1min, Xmax, Xmin, Ymax, Ymin)

我如何通过允许 PosX 落入 DF_1min 和 PosY 中的 Xmax 和 Xmin 范围内的单元格来找到 DF_26min 中的哪些单元格对应于 DF_1min 中的单元格,并且 PosY 落入 Ymax 和Ymin 范围?

也许更好的解决方案可能是下一个最近邻解决方案,但这听起来可能超出了要求。

我在 StackOverflow 上尝试过大量线程问题,但即使有管道,我整个周末都在绞尽脑汁。

非常感谢您抽出宝贵时间阅读此问题。这对我博士的最后一部分很有帮助。

标记。

【问题讨论】:

    标签: r time coordinates variation


    【解决方案1】:
    • 对于DF_1min 中的最近,对于DF_26min 中的每个单元格位置:

      distance 函数基于 euclidean 距离,从点 x 到集合/数据框 df:

      distance <- function(x, df = DF_1min) {
      apply( df[,c('PosX','PosY')], 1, function(y) {diff <- (y - x); sqrt(sum(diff^2))} )
                                            }
      
      # calculating nearest/ min distance for every cell position in DF_26min
      nearest <- apply( DF_26min, 1, function(y) which.min(x = distance(y)) )
      

      您还可以检查dist 功能,以便轻松实施其他距离测量。 “manhattan”、“canberra”、“binary”或“minkowski”等。

      # Nearest indices from DF_1min and corresponding X, Y positions
      DF_26min['Nearest'] <- nearest
      DF_26min[,c('Nearest_Pos_X', 'Nearest_Pos_Y')] <- DF_1min[nearest,c('PosX', 'PosY')]
      
    • 为了在 26 分钟 进行检查,如果 PosX 和 PosY 独立 并且 逐点进行 在其nearest 点的范围内,您可以这样做以获得相等长度的逻辑向量:

      DF_26min[,'X_Inrange'] <- ((DF_26min$PosX >= DF_1min[nearest,'Xmin']) & (DF_26min$PosX <= DF_1min[nearest,'Xmax']))
      DF_26min[,'Y_Inrange'] <- ((DF_26min$PosY >= DF_1min[nearest,'Ymin']) & (DF_26min$PosY <= DF_1min[nearest,'Ymax']))
      DF_26min[,'PXY_Inrange'] <- (rowSums(DF_26min[,c('X_Inrange','Y_Inrange')]) == 2)
      
    • 用于查找范围内最近的单元格/位置:NIR

      Nearest_IR <- function(x, df = DF_1min) {
      
           n <- nrow(df)
           X_Inrange <- ((rep(x[1],n) >= DF_1min[,'Xmin']) & (rep(x[1],n) <= DF_1min[,'Xmax']))
           Y_Inrange <- ((rep(x[2],n) >= DF_1min[,'Ymin']) & (rep(x[2],n) <= DF_1min[,'Ymax'])) 
           XY_Inrange <- (rowSums(cbind(X_Inrange,Y_Inrange)) == 2)  
           distance <- apply( df[,c('PosX','PosY')] , 1 , function(y) {diff <- (y - x) ; sqrt(sum(diff^2))} )
      
           df_temp <- cbind(ID = seq.int(n), df, XY_Inrange, distance)
      
           if (sum(df_temp$XY_Inrange == TRUE) == 0 ){
           return (NA)   
           } else {
           NIR <- df_temp$ID[df_temp$distance == min(df_temp$distance[df_temp$XY_Inrange == TRUE])]
           return (NIR)  }  
                                                }
      
      DF_26min[,'Nearest_IR'] <- apply( DF_26min, 1, Nearest_IR )
      
      DF_26min[,c(1:3,8,9)]
      # PosX  PosY    Nearest PXY_Inrange Nearest_IR
      # 1.0   0.0     5           FALSE   NA
      # 2.0   1.0     2           TRUE    2
      # 1.5   2.0     3           TRUE    3
      # 2.2   0.5     4           FALSE   5 
      

      数据:

      DF_26min = data.frame(PosX = c(1,2,1.5,2.2) , PosY = c(0,1,2,0.5))
      DF_1min <- data.frame(PosX = c(4.2,2.1,1.8,2.1,2.05) , PosY = c(0.2,1.1,2.15,0.6,0.5))
      DF_1min['Xmin'] <- DF_1min['PosX']*0.8
      DF_1min['Xmax'] <- DF_1min['PosX']*1.1
      DF_1min['Ymin'] <- DF_1min['PosY']*0.9
      DF_1min['Ymax'] <- DF_1min['PosY']*1.2
      

    【讨论】:

    • 非常感谢。您知道如何更改上述内容,以便我可以交叉引用这两个表,以便我可以匹配位置。我遇到的问题是,并非所有细胞都出现在 26 分钟时间点和 1 分钟时间点。也就是说,一些细胞最终要么染色,要么失去染色来识别它们。例如,我在 DF_1min 中有 163 个单元格,在 DF_26min 中有 135 个单元格。细胞也没有按顺序计数,所以我需要能够根据 1 分钟时所有细胞的范围(Xmin 和 Xmax、Ymin 和 Ymax)测试 PosX 和 PosY 26 分钟。
    • 在这种情况下,一个 26 分钟的单元格可能会落在 1 分钟的多个单元格的范围内。您要返回一个向量,表示 DF_1min 中的所有点分别在 DF_26 中的每个点的范围内吗?
    • 是的,但是我想最好使用最近的单元格校正。尽管 DF_26min 中的两个单元格匹配 1 个 DF_1min,但其中一个单元格会比另一个更近吗?非常感谢您对此的帮助。我将在下周的一次会议上发表演讲,并且一定会提到这项工作作为未来的方向。
    • 不错。乐意效劳。例如,最近并不一定意味着它会在范围内。它可能在范围之外,但仍然是最近的。您希望同时满足条件还是最接近的条件?
    • 我修改了代码以找到最近的,然后检查它是否在它的范围内。请注意,可能还有其他不那么近的点,但可以在其范围内有一个点。
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 2014-02-09
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多