генерировать полиномиальные случайные величины с переменным размером выборки в R - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно генерировать полиномиальные случайные величины с переменным размером выборки.

Допустим, я уже сгенерировал размеры выборки следующим образом,

samplesize =c(50,45,40,48)

, затем мне нужно сгенерировать полиномиальные случайные величины на основена этом переменном размере выборки.Я попробовал это с помощью цикла for и с помощью функции apply (sapply).

Используя цикл For,

p1=c(0.4,0.3,0.3)
for( i in 1:4)
{
xx1[i]=rmultinom(4, samplesize[i], p1)
} 

Если мой код правильный, тогда я должен получить матрицу, которая имеет 4 столбца и 3 строки.Где итоги столбца должны равняться каждому значению в размерах выборки.Но я этого не понимаю.

Используя Sapply,

sapply( samplesize ,function(x)
{
  rmultinom(10, samplesize[x], p1)
})

Здесь я также получаю сообщение об ошибке.

Так может ли кто-нибудь помочь мне понять, что пошло не так?

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы можете избежать цикла с mapply, если хотите:

samplesize <- c(50, 45, 40, 48)
p <- c(0.4, 0.3, 0.3)

mapply(rmultinom, samplesize, MoreArgs = list(n=1, prob=p))

#     [,1] [,2] [,3] [,4]
#[1,]   15   22   14   18
#[2,]   13    9   14   12
#[3,]   22   14   12   18
0 голосов
/ 14 октября 2018

Я думаю, что могу использовать этот метод, используя функцию репликации, чтобы решить мою проблему, не так ли?

r1= c(0.34,0.33,0.33)
    rep=10
    size=500
    alpha=0.05
    q=0.1

    set.seed(1)
    didnt_vote=rbinom(rep, size, q)
    replicate(n=1,rmultinom(rep,didnt_vote,r1) )
0 голосов
/ 03 октября 2018
samplesize <- c(50, 45, 40, 48)
p <- c(0.4, 0.3, 0.3)

## method 1
set.seed(0)
xx1 <- matrix(0, length(p), length(samplesize))
for(i in 1:length(samplesize)) {
  xx1[, i] <- rmultinom(1, samplesize[i], p)
  }
xx1
#     [,1] [,2] [,3] [,4]
#[1,]   24   17   20   24
#[2,]   11   14    8   16
#[3,]   15   14   12    8
colSums(xx1)
#[1] 50 45 40 48

## method 2
set.seed(0)
xx2 <- sapply(samplesize, rmultinom, n = 1, prob = p)
xx2
#     [,1] [,2] [,3] [,4]
#[1,]   24   17   20   24
#[2,]   11   14    8   16
#[3,]   15   14   12    8
colSums(xx2)
#[1] 50 45 40 48

Примечание: rmultinom не "векторизовано", как другие функции распределения скажем rnorm.

set.seed(0)
fail <- rmultinom(length(samplesize), samplesize, p)
#     [,1] [,2] [,3] [,4]
#[1,]   24   19   25   24
#[2,]   11   16   10   17
#[3,]   15   15   15    9
colSums(fail)
#[1] 50 50 50 50

Таким образом, уровень R for цикл или sapply цикл или использование функции сахара Vectorize необходим.

...