Случайная выборка от данного двумерного дискретного распределения

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

sample(100,prob=biprob)

где biprob является 2 размерными матрицами?

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

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

Куда X и Y прибывают из

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 () для моделирования "двумерности". Интуитивно я должен получить что-то подобное тому, в чем я нуждаюсь. Я не уверен, что это - корректный путь все же. Следовательно вопрос :)

Иначе должен использовать Gibbs, выбирающего, предельные распределения легко вычислить.

Я пытался гуглить, но ничто действительно соответствующее не прибыло.

7
задан mpiktas 17 February 2010 в 14:46
поделиться

2 ответа

Вы думаете, что это слишком сложно:

ksort($arrTags);
arsort($arrTags);

Теперь массив отсортирован так, как вы хотите.

-121--2102898-

Невозможно создать цепочку таких выражений в PHP, поэтому необходимо сохранить результат array _ test () в переменной.

Попробуйте:

function array_test() {
  return array(0, 1, 2);
}

$array = array_test();
echo $array[0];
-121--1289832-

Вы почти там. Предположим, что у вас есть кадр данных 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]
8
ответ дан 6 December 2019 в 14:03
поделиться

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

Таким образом, в 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
7
ответ дан 6 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: