3 votes

générer des variables aléatoires multinomiales avec une taille d'échantillon variable en R

Je dois générer des variables aléatoires multinomiales avec une taille d'échantillon variable.

Supposons que j'ai déjà généré mes tailles d'échantillon comme suit,

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

Je dois ensuite générer des variables aléatoires multinomiales sur la base de cette taille d'échantillon variable. J'ai essayé en utilisant une boucle for et une fonction apply (sapply).

Utilisation de la boucle For ,

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

Si mon code est correct, je devrais obtenir une matrice de 4 colonnes et 3 lignes. Les totaux des colonnes devraient être égaux à chaque valeur de la taille des échantillons. Mais ce n'est pas le cas.

Utilisation de Sapply ,

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

J'obtiens également une erreur.

Quelqu'un peut-il m'aider à comprendre ce qui s'est passé ?

Merci de votre attention.

3voto

李哲源 Points 45737
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

Remarque : rmultinom n'est pas "vectorisée" comme d'autres fonctions de distribution dire 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

Ainsi, le niveau R for ou sapply ou en utilisant la fonction sucre Vectorize est nécessaire.

2voto

Dan Y Points 4611

Vous pouvez éviter la boucle avec mapply si vous aimez :

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

1voto

student_R123 Points 369

Je pense que je peux utiliser cette méthode en utilisant la fonction de réplication pour résoudre mon problème, n'est-ce pas ?

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) )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X