Générer des nombres aléatoires avec moyenne fixe et sd

lors de la génération de nombres aléatoires dans R en utilisant rnorm (ou runif etc.), ils ont rarement la moyenne exacte et L'écart type de la distribution d'où ils sont échantillonnés. Y a-t-il un ou deux doublures qui font ça pour moi? Comme solution préliminaire, j'ai créé cette fonction mais il semble que ce soit quelque chose qui devrait être natif de R ou quelque paquet.

# Draw sample from normal distribution with guaranteed fixed mean and sd
rnorm_fixed = function(n, mu=0, sigma=1) {
  x = rnorm(n)  # from standard normal distribution
  x = sigma * x / sd(x)  # scale to desired SD
  x = x - mean(x) + mu  # center around desired mean
  return(x)
}

exemple:

x = rnorm(n=20, mean=5, sd=10)
mean(x)  # is e.g. 6.813...
sd(x)  # is e.g. 10.222...

x = rnorm_fixed(n=20, mean=5, sd=10)
mean(x)  # is 5
sd(x)  # is 10

la raison pour laquelle je veux ceci est que j'ajuste mon analyse sur des données simulées avant en l'appliquant à des données réelles. C'est bien parce qu'avec des données simulées je connais les propriétés exactes (moyennes, SDs etc.) et j'évite l'inflation de la valeur p parce que je fais des statistiques inférentielles. Je demande s'il existe quelque chose de simple comme par exemple

rnorm(n=20, mean=5, sd=10, fixed=TRUE)
17
demandé sur Ben Bolker 2013-09-20 18:22:08

2 réponses

depuis que vous avez demandé un one-liner:

rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
mean(r)  ## 4
sd(r)    ## 1
26
répondu Ben Bolker 2013-09-20 16:10:34

il s'agit d'une amélioration de la fonction suggérée dans une réponse précédente afin qu'elle réponde au besoin de L'OP d'avoir un argument "fixe".

Et toujours dans une ligne ;-)

rnorm. <- function(n=10, mean=0, sd=1, fixed=TRUE) { switch(fixed+1, rnorm(n, mean, sd), as.numeric(mean+sd*scale(rnorm(n)))) }
rnorm.() %>% {c(mean(.), sd(.))}
#### [1] 0 1
rnorm.(,,,F) %>% {c(mean(.), sd(.))}
#### [1] 0.1871827 0.8124567

j'ai choisi d'entrer des valeurs par défaut pour chaque argument et ajouter un as.numeric étape pour se débarrasser des attributs générés par l' scale fonction.

1
répondu agenis 2016-09-22 20:46:35