R 计算一组区间之间的成对距离

R 计算一组区间之间的成对距离,r,intervals,R,Intervals,假设我有一组闭合的线性区间,由这个矩阵表示: interval.mat = matrix(c(1,2,3,5,4,6,8,9), byrow = TRUE, ncol = 2) 其中,interval.mat[,1]为区间起点,interval.mat[,2]为相应终点 我正在寻找一种有效的方法(因为这个示例矩阵是一个玩具,实际上我的矩阵包含数千个区间)来生成一个矩阵,该矩阵将容纳区间之间的所有成对正距离。一对间隔之间的距离应为两个间隔中一端较大的间隔的起点减去一端较小的间隔的终点。例如,间隔

假设我有一组闭合的线性区间,由这个矩阵表示:

interval.mat = matrix(c(1,2,3,5,4,6,8,9), byrow = TRUE, ncol = 2)
其中,
interval.mat[,1]
为区间起点,
interval.mat[,2]
为相应终点

我正在寻找一种有效的方法(因为这个示例矩阵是一个玩具,实际上我的矩阵包含数千个区间)来生成一个矩阵,该矩阵将容纳区间之间的所有成对正距离。一对间隔之间的距离应为两个间隔中一端较大的间隔的起点减去一端较小的间隔的终点。例如,间隔
c(1,2)
c(3,5)
之间的距离应该
3-2=1
,因为第二个间隔在第一个间隔之后结束。如果间隔重叠,则距离应为0。例如,在
c(3,5)
c(4,6)
的情况下,距离为0

因此,上述间隔的成对距离矩阵为:

> matrix(c(0,1,2,6,1,0,0,3,2,0,0,2,6,3,2,0), byrow = TRUE, nrow = 4, ncol = 4)
     [,1] [,2] [,3] [,4]
[1,]    0    1    2    6
[2,]    1    0    0    3
[3,]    2    0    0    2
[4,]    6    3    2    0

您可以使用
proxy
包,该包具有允许用户定义距离函数的
dist(…)
方法。请注意,加载此库将屏蔽base R中的
dist(…)
函数

library(proxy)
f <- function(x,y) max(min(x)-max(y),0)
as.matrix(dist(interval.mat,method=f))
#   1 2 3 4
# 1 0 1 2 6
# 2 1 0 0 3
# 3 2 0 0 2
# 4 6 3 2 0
库(代理)

这里有一个Rcpp解决方案。这将是快速和内存效率(详情见下文)

首先,让我们定义一个辅助函数,用于计算所有成对距离。如果<代码> n>代码>是要考虑的间隔数,则我们有<代码> n*(n-1)/2 < /COD>向量对(我们不考虑相同的间隔,当然,因为它们之间的距离是0)。 上述对象可转换为“普通”方阵:

as.matrix(distint(interval.mat))
##   1 2 3 4
## 1 0 1 2 6
## 2 1 0 0 3
## 3 2 0 0 2
## 4 6 3 2 0
除非距离矩阵是稀疏的(有许多零),否则上述解决方案是存储效率高的

基准:

test <- matrix(runif(1000), ncol=2)
library('microbenchmark')
library(proxy)
f <- function(x,y) max(min(x)-max(y),0)
microbenchmark(distint(test), as.matrix(dist(test, method=f)), times=10)

## Unit: milliseconds
##                               expr        min         lq     median         uq        max neval
##                      distint(test)   1.584548   1.615146   1.650645   3.071433   3.164231    10
##  as.matrix(dist(test, method = f)) 455.300974 546.438875 551.596582 599.977164 609.418194    10

测试在区间空间中使用什么度量?那么从(1,2)到(3,5)的距离是1?从(3,5)到(4,6)再到is-1?这显然不是欧几里得距离。距离是多少?跟进Flick和gagolews先生的问题,(例如)1,5和(2,3)之间的距离应该是多少?非常感谢您的评论。我把我的问题修改得更清楚了。
as.matrix(distint(interval.mat))
##   1 2 3 4
## 1 0 1 2 6
## 2 1 0 0 3
## 3 2 0 0 2
## 4 6 3 2 0
test <- matrix(runif(1000), ncol=2)
library('microbenchmark')
library(proxy)
f <- function(x,y) max(min(x)-max(y),0)
microbenchmark(distint(test), as.matrix(dist(test, method=f)), times=10)

## Unit: milliseconds
##                               expr        min         lq     median         uq        max neval
##                      distint(test)   1.584548   1.615146   1.650645   3.071433   3.164231    10
##  as.matrix(dist(test, method = f)) 455.300974 546.438875 551.596582 599.977164 609.418194    10