Предположим, что у меня есть двумерное дискретное распределение, т.е. таблица вероятности оценивает 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, выбирающего, предельные распределения легко вычислить.
Я пытался гуглить, но ничто действительно соответствующее не прибыло.
Вы думаете, что это слишком сложно:
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]
Мне непонятно, почему вам нужно заботиться о том, что он двумерный. Сумма вероятностей равна единице, а результаты дискретны, поэтому вы просто выбираете из категориального распределения . Единственное отличие состоит в том, что вы индексируете наблюдения, используя строки и столбцы, а не одну позицию. Это всего лишь обозначение.
Таким образом, в 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