2013-06-10 5 views
0

Je génère 100 nombres aléatoires à partir de la distribution Dirichlet, puis j'ai besoin d'utiliser la sortie pour générer à partir de la distribution Gamma. Voici le code:Erreur avec Sapply dans R

a <- rdirichlet(100, c(1,1,1)) 
b <- c(3,3,3) 

sapply(a, function(x) {rgamma(100, shape=2, rate =(b%*%a)) }) 

Notez ici que le taux de distribution gamma est le produit scalaire des vecteurs b et un (qui est la sortie de Dirichlet).

Je reçois ce message d'erreur:

Error in b %*% a : non-conformable arguments 
+1

'sapply' applique une fonction à chaque élément d'un. Vous ne l'utilisez pas correspon- dant. –

+0

@ Roman Luštrik: Je crois que le problème est en multipliant b% *% a. Savez-vous comment obtenir le produit scalaire ici? Merci! – user9292

Répondre

1

Je suppose que vous voulez. Ma bibliothèque a au moins quatre paquets différents avec rdirichlet fonctions).

library(MCMCpack) 
apply(a, 1, function(x) {rgamma(100, shape=2, rate =(b %*% x)) }) 

Lorsque les vecteurs sont passés à% *% doivent alors être la même longueur et sapply se passait des éléments individuels plutôt que de longueur 3 lignes. (Vous aussi ne pas avoir "x" dans l'expression.)

c(3,3,3) %*% 1 
#Error in c(3, 3, 3) %*% 1 : non-conformable arguments 

str(a %*% b) 
# vectors can be assumed to be column matrices in the second position 
num [1:100, 1] 3 3 3 3 3 3 3 3 3 3 ... 

OU:

> str(b %*% t(a)) 
# .... or assumed to be row matrices in the first position. 
num [1, 1:100] 3 3 3 3 3 3 3 3 3 3 ... 
+0

quand je cours ce code, la sortie est 100x100 matrice, mais je crois que ce devrait être 100x1. – user9292

+0

Pourquoi? Vous demandez 100 tirages gamma aléatoires avec chaque nouvelle ligne de "a". –

+0

Oui. Je veux que le résultat de ceci (b% *% a) soit un nombre unique, et donc, quand je génère à partir de gamma, j'obtiendrai 100 nombres. – user9292