使用 ppx 和 nndist 查找每种类型的最近邻居

Using ppx and nndist to find nearest neighbour of each type

对于具有三个协变量和一个治疗指标的数据集,我试图找到每个人的最近邻居。特别是,我想在每个处理组中找到最近的邻居。

# Generate a treatment indicator factor
treatment <- factor(data_train[,"a"], levels = c("0", "1"), labels = c("Untreated", "Treated"))

# Put the covariate data into 'points' format
pointpattern <- ppx(data = data.frame(data_train[, c("Z1", "Z2", "Z3")], "Treatment" = treatment), coord.type = c("s", "s", "s", "m"))

# Find the nearest neighbour of each type
dists <- nndist(X = pointpattern, by = marks(pointpattern))

然而对象'dists'只是一个向量,似乎是最近的邻居,完全忽略了处理组。

我花了将近一整天的时间来弄清楚我做错了什么 - 请帮忙!

您在此示例中使用的函数 nndist.ppx 无法识别参数 by

这是关于 R 中的 "classes and methods"。函数 nndist 是通用的;当您在 class "ppx" 的对象上调用 nndist 时,系统会调用函数 nndist.ppx,这是此 class 的 "method"。

您可以通过查看其帮助文件来检查 nndist.ppx 的功能;它不支持参数 by.

还有其他 nndist 方法可以识别参数 by,例如 nndist.ppp,我想您正在查看相关文档。

我们将更新 spatstat 中的代码,以便此功能也可用于 nndist.ppx

同时,您可以使用函数nncross.ppx 查找一组点到另一组点的最近距离。以下是如何获得您想要的结果:

Y <- split(pointpattern) # divide into groups
m <- length(Y) # number of groups
n <- npoints(pointpattern)
result <- matrix(, n, m) # final results will go here
partresults <- list() # collect results for each group here
for(i in 1:m) {
  Yi <- Y[[i]]
  ni <- npoints(Yi)
  a <- matrix(, ni, m)
  a[,i] <- nndist(Yi)
  for(j in (1:m)[-i]) 
     a[,j] <- nncross(Yi, Y[[j]], what="d")
  partresults[[i]] <- a
}
split(result, marks(pointpattern)) <- partresults

那么result就是你想要的距离矩阵。