Я хочу сгенерировать матрицу (4 строки и 30 столбцов) в программном обеспечении R со случайными элементами по диапазону элементов от 0 до 1, в котором сумма каждой строки равна 1.

r
2
Sharon 1 Апр 2017 в 14:56

2 ответа

Лучший ответ

Если вы выберете n чисел в [0,1], сумма которых равна 1, вы фактически выберете n-1 контрольные точки. Вы можете выбрать точки останова и затем вернуться к номерам:

rand.sum <- function(n){
  x <- sort(runif(n-1))
  c(x,1) - c(0,x)
}

А потом

t(replicate(4,rand.sum(30)))

Будет матрица случайных чисел 4x30, где каждая строка суммирует 1.

2
John Coleman 1 Апр 2017 в 12:40

Вот решение, основанное на преобразовании softmax (многочленный логит).

m <- matrix(rnorm(4 * 30), nrow=30)
prob <- exp(m)/rowSums(exp(m))

rowSums(prob)
#[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

all(prob > 0 & prob < 1)
#[1] TRUE
3
Hong Ooi 1 Апр 2017 в 12:05