Использование ppx и nndist для поиска ближайшего соседа каждого типа - PullRequest
0 голосов
/ 23 апреля 2020

Для набора данных с тремя ковариатами и показателем лечения я пытаюсь найти ближайшего соседа каждого человека. В частности, я хочу найти ближайшего соседа в каждой из групп лечения.

# 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" - это всего лишь вектор, который выглядит как ближайший сосед с полностью игнорированной группой лечения. .

Я провел почти целый день, пытаясь выяснить, что я делаю неправильно - пожалуйста, помогите!

1 Ответ

1 голос
/ 24 апреля 2020

Аргумент by не распознается функцией nndist.ppx, которую вы используете в этом примере.

Это касается "классов и методов" в R. Функция nndist является общей; когда вы вызываете nndist для объекта класса "ppx", система вызывает функцию nndist.ppx, которая является «методом» для этого класса.

Вы можете проверить возможности 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 - это матрица расстояний, которую вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...