R中的最近邻匹配
我有一个10000个观察值(数值)的列表。我想使用最近邻匹配从这些观察结果中生成5000对匹配对。我正试图想出一个有效的方法来做到这一点 我的计划是对它们进行排序,然后将观测值i和i+1称为一对,因为i=1,3,…,9999,但这似乎不是最优的,因为(取决于我的排序方式)较低/较高的值会得到更接近的匹配 有人对更好的方法有什么建议吗 我已经检查了R包是否匹配。然而,这些都要求我指出一些我没有的治疗/控制变量。我只想根据数字之间的接近程度将它们配对 先谢谢你 数据结构:c(0.732851696218165,-0.479344482931516,-0.1395821592376, 0.477291542874127、0.485648507877746、0.226366004586156)R中的最近邻匹配,r,matching,nearest-neighbor,R,Matching,Nearest Neighbor,我有一个10000个观察值(数值)的列表。我想使用最近邻匹配从这些观察结果中生成5000对匹配对。我正试图想出一个有效的方法来做到这一点 我的计划是对它们进行排序,然后将观测值i和i+1称为一对,因为i=1,3,…,9999,但这似乎不是最优的,因为(取决于我的排序方式)较低/较高的值会得到更接近的匹配 有人对更好的方法有什么建议吗 我已经检查了R包是否匹配。然而,这些都要求我指出一些我没有的治疗/控制变量。我只想根据数字之间的接近程度将它们配对 先谢谢你 数据结构:c(0.7328516962
它基本上是一个数字向量 通过@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@Metricscombn
!我知道有办法让这项任务更容易,但我想不起来。它应该是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
}