2017-07-20 3 views
1

Je voudrais générer une distribution normale tronquée avec des paramètres connus dans l'un ou l'autre R. Notez que je ne cherche pas de générateur de nombres pseudo-aléatoires.Comment tracer une distribution normale tronquée avec des paramètres connus, dans R

Supposons que j'ai une distribution normale avec la moyenne 5 et l'écart type de 1. Puis-je tracer les valeurs d'une distribution normale tronquée, tronquée aux points 1 et 10?

+0

Parlez-vous du paquet 'truncnorm'? La fonction 'dtruncnorm' donne la densité – juan

+0

Hi @juan. Oui, je parle du paquet truncnorm. J'ai essayé la fonction dtruncnorm mais elle ne semble pas donner la densité. Par exemple si j'entre le code: 'vec = seq (de = 0, par = 0.01, longueur.out = 100) test = dtruncnorm (vec, a = 0, b = 1, moyenne = 0.1, sd = 0.1) plot (test) 'alors j'obtiens un tracé qui a la forme exacte d'une distribution normale tronquée, et les valeurs x sont précises. Cependant, l'axe des y va de 0 à 5. Cela signifie qu'il ne montre pas les densités (elles devraient toutes être inférieures à 1) – user5211911

+1

Si la plage de l'axe des ordonnées dépasse 1, cela ne signifie pas ** Ce n'est pas une densité. C'est l'intégrale sur l'espace (ou R, la ligne réelle) qui doit être égale à 1. –

Répondre

0

J'ai trouvé une solution à ce problème. Cela peut être fait en utilisant la fonction dtruncnorm du paquet truncnorm comme suggéré précédemment par juan. Je vais démontrer cela en utilisant l'exemple dans la question d'une distribution normale avec la moyenne 5, l'écart type de 1 et les limites de 1 et 10.

D'abord, vous devez créer un vecteur du nombre de points à tracer à partir de la distribution , qui sera également espacé. Ainsi, par exemple, si vous vouliez tracer dix points de la distribution à distance égale, votre vecteur (« VEC ») serait:

vec=seq(from=1,by=1,length.out = 10) 

ce qui précède faire en sorte que nous traçons 10 points à partir de 1, incrémente de 1 , jusqu'à la valeur 10.

Nous avons ensuite mis ces derniers dans la fonction dtruncnorm() et enregistrez-le dans la variable « test », puis tracer le: Comme vous le voyez

test=dtruncnorm(vec,a=1,b=10,mean=5,sd=1) 
plot(test) 

, cette courbe de la densité à des points discrets. Vous pouvez facilement essayer de faire le tracé continu en augmentant le nombre de points:

vec=seq(from=1,by=0.1,length.out = 100) 
test=dtruncnorm(vec,a=1,b=10,mean=5,sd=1) 
plot(test) 

S'il vous plaît commentaire si vous avez des questions

2

La fonction suivante génère des nombres (pseudo) aléatoires pour toute distribution tant que les fonctions 'd' et 'p' sont disponibles. Dans le langage R cela signifie que vous devez avoir dnorm et pnorm, ce que vous faites, ils font partie de la base R.

# 
# random numbers for truncated distribution 
# 
rtrunc <- function(n, distr, lower = -Inf, upper = Inf, ...){ 
    makefun <- function(prefix, FUN, ...){ 
     txt <- paste(prefix, FUN, "(x, ...)", sep = "") 
     function(x, ...) eval(parse(text = txt)) 
    } 
    if(length(n) > 1) n <- length(n) 
    pfun <- makefun("p", distr, ...) 
    qfun <- makefun("q", distr, ...) 
    lo <- pfun(lower, ...) 
    up <- pfun(upper, ...) 
    u <- runif(n, lo, up) 
    qfun(u, ...) 
} 

# Example: 
x <- rtrunc(1, "norm", lower = 0, mean = 2, sd = 5) 
+0

hey @rui, cela génère pseudo aléatoire no.s mais ne donne pas la densité. Je ne voudrais pas les nombres aléatoires de la distribution, je dois être capable de choisir n'importe quelle valeur dans l'espace d'échantillon de la norme tronquée. dist. puis d'obtenir la densité respective pour cette valeur. – user5211911

+0

Pour la densité, voir le commentaire de juan ci-dessus, et ma réponse à votre réponse. –