R中的最近邻匹配

R中的最近邻匹配,r,matching,nearest-neighbor,R,Matching,Nearest Neighbor,我有一个10000个观察值(数值)的列表。我想使用最近邻匹配从这些观察结果中生成5000对匹配对。我正试图想出一个有效的方法来做到这一点 我的计划是对它们进行排序,然后将观测值i和i+1称为一对,因为i=1,3,…,9999,但这似乎不是最优的,因为(取决于我的排序方式)较低/较高的值会得到更接近的匹配 有人对更好的方法有什么建议吗 我已经检查了R包是否匹配。然而,这些都要求我指出一些我没有的治疗/控制变量。我只想根据数字之间的接近程度将它们配对 先谢谢你 数据结构:c(0.7328516962

我有一个10000个观察值(数值)的列表。我想使用最近邻匹配从这些观察结果中生成5000对匹配对。我正试图想出一个有效的方法来做到这一点

我的计划是对它们进行排序,然后将观测值i和i+1称为一对,因为i=1,3,…,9999,但这似乎不是最优的,因为(取决于我的排序方式)较低/较高的值会得到更接近的匹配

有人对更好的方法有什么建议吗

我已经检查了R包是否匹配。然而,这些都要求我指出一些我没有的治疗/控制变量。我只想根据数字之间的接近程度将它们配对

先谢谢你

数据结构:c(0.732851696218165,-0.479344482931516,-0.1395821592376, 0.477291542874127、0.485648507877746、0.226366004586156)


它基本上是一个数字向量

通过@Metrics刷新我的内存,并以稍微不同的方向跟踪原始索引,下面是一个函数:

mypairs <- function(x) {
    require("plyr")
    np <- length(x)
    g <- expand.grid(x, x)
    names(g) <- c("valueA", "valueB")
    g$absDiff <- abs(g$valueB - g$valueA)
    g$ind1 <- rep(1:np, np)
    g$ind2 <- rep(1:np, each = np)
    g <- arrange(g, absDiff)
    # remove g$diff == 0
    g <- g[-which(g$absDiff == 0),]
    # now every other value is a duplicate
    dups <- as.logical(1:nrow(g)%%2)
    g <- g[dups,]
    return(g)
    }

tst <- mypairs(rnorm(3)); tst

ind1
ind2
是原始向量中的值的索引,可能会引起兴趣。它的速度非常慢,因为有比需要的更多的组合(
combn
没有这个问题,但它不容易跟踪原始索引)。我正在考虑如何加快速度,但目前我还是一片空白。

毫无疑问,你已经前进了,但我在这里一直在关注这个小逻辑问题,以及如何加快速度!这是一个改进的函数,它对长向量的性能要好得多

mypairs <- function(x) {
    require("plyr")
    np <- length(x)
    M <- matrix(NA_real_, np, np)
    for (i in 1:np) {
        for (j in 1:np) { # compute only upper triangle
            if (j > i) M[i,j] <- x[j]-x[i]
            }
        }
    M <- abs(M)
    # unstack column by column
    d <- vector("numeric", np^2)
    for (i in 1:np) {
        d[(np*(i-1)+1):(np*i)] <- M[,i]
        }
    idx1 <- rep(1:np, np) # row index
    idx2 <- rep(1:np, each = np) # column index
    nope <- which(is.na(d))
    d <- d[-nope]
    idx1 <- idx1[-nope]
    idx2 <- idx2[-nope]
    df <- data.frame(dist = d, ptA = idx1, ptB = idx2)
    df <- arrange(df, d)
    df
    }

mypairs我们需要至少了解一点数据结构。您可以使用
dput(head(您的_数据))
将结果作为编辑粘贴到问题中。听起来你想计算每个观测值之间的距离,但是有很多方法,正确的方法取决于上下文。编辑——基本上是一个数字向量,我想以匹配的数字对结束,在这些数字接近的地方,所以任意两个值之间的距离就是
n1-n2
。您是想要距离的绝对值,还是符号很重要?这可能有帮助:
y@Metrics
combn
!我知道有办法让这项任务更容易,但我想不起来。它应该是
y如果这是您需要的输出类型,请告诉我。我有一个非常好的想法,可以得到一个更快的版本。
mypairs <- function(x) {
    require("plyr")
    np <- length(x)
    M <- matrix(NA_real_, np, np)
    for (i in 1:np) {
        for (j in 1:np) { # compute only upper triangle
            if (j > i) M[i,j] <- x[j]-x[i]
            }
        }
    M <- abs(M)
    # unstack column by column
    d <- vector("numeric", np^2)
    for (i in 1:np) {
        d[(np*(i-1)+1):(np*i)] <- M[,i]
        }
    idx1 <- rep(1:np, np) # row index
    idx2 <- rep(1:np, each = np) # column index
    nope <- which(is.na(d))
    d <- d[-nope]
    idx1 <- idx1[-nope]
    idx2 <- idx2[-nope]
    df <- data.frame(dist = d, ptA = idx1, ptB = idx2)
    df <- arrange(df, d)
    df
    }