Случайная выборка из заданного двумерного дискретного распределения - PullRequest
7 голосов
/ 17 февраля 2010

Предположим, у меня есть двумерное дискретное распределение, то есть таблица значений вероятности P (X = i, Y = j) для i = 1, ... n и j = 1, ... m. Как мне сгенерировать случайную выборку (X_k, Y_k), k = 1, ... N из такого распределения? Может быть, есть готовая функция R вроде:

sample(100,prob=biprob)

где бипроб 2-х мерная матрица?

Один из интуитивно понятных способов отбора проб заключается в следующем. Предположим, у нас есть data.frame

dt=data.frame(X=x,Y=y,P=pij)

Откуда х и у

expand.grid(x=1:n,y=1:m)

и pij - это P (X = i, Y = j).

Затем мы получаем наш образец (Xs, Ys) размера N следующим образом:

set.seed(1000) 
Xs <- sample(dt$X,size=N,prob=dt$P)
set.seed(1000)
Ys <- sample(dt$Y,size=N,prob=dt$P)

Я использую set.seed () для имитации «двумерности». Интуитивно я должен получить что-то похожее на то, что мне нужно. Я не уверен, что это правильный путь. Отсюда и вопрос :)

Другой способ - использовать выборку Гиббса, предельные распределения легко вычислить.

Я попробовал поискать в Google, но на самом деле ничего не вышло.

Ответы [ 2 ]

8 голосов
/ 17 февраля 2010

Вы почти у цели. Предполагая, что у вас есть фрейм данных dt со значениями x, y и pij, просто выберите строки!

dt <- expand.grid(X=1:3, Y=1:2)
dt$p <- runif(6)
dt$p <- dt$p / sum(dt$p)  # get fake probabilities
idx <- sample(1:nrow(dt), size=8, replace=TRUE, prob=dt$p)
sampled.x <- dt$X[idx]
sampled.y <- dt$Y[idx]
7 голосов
/ 18 февраля 2010

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

Таким образом, в R вы можете легко сделать выборку из своего распределения путем изменения формы данных и выборки из категориального распределения. Выборка по категориям может быть выполнена с использованием rmultinom и использованием which для выбора индекса или, как предлагает Анико, с использованием sample для выборки строк измененных данных. Некоторая бухгалтерия может позаботиться о вашем конкретном случае.

Вот решение:

library(reshape)

# Reshape data to long format.
data <- matrix(data = c(.25,.5,.1,.4), nrow=2, ncol=2)
pmatrix <- melt(data)

# Sample categorical n times.
rcat <- function(n, pmatrix) {
    rows <- which(rmultinom(n,1,pmatrix$value)==1, arr.ind=TRUE)[,'row']
    indices <- pmatrix[rows, c('X1','X2')]
    colnames(indices) <- c('i','j')
    rownames(indices) <- seq(1,nrow(indices))
    return(indices)
}

rcat(3,pmatrix)

Это возвращает 3 случайных отрисовки из вашей матрицы, сообщая о i и j строк и столбцов:

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