web-dev-qa-db-fra.com

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

Lors de la génération de nombres aléatoires dans R à l'aide de rnorm (ou runif etc.), ils ont rarement la moyenne exacte et SD comme la distribution à partir de laquelle ils sont échantillonnés. Y a-t-il un simple ou deux doublures qui fait cela pour moi? Comme solution préliminaire, j'ai créé cette fonction mais elle semble être quelque chose qui devrait être natif de R ou d'un 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)
}

Pour illustrer:

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 cela est que j'ajuste mon analyse sur des données simulées avant de l'appliquer à des données réelles. C'est bien car avec des données simulées, je connais les propriétés exactes (moyennes, écart-type, 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)
22
Jonas Lindeløv

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
37
Ben Bolker

Il s'agit d'une amélioration de la fonction suggérée dans une réponse précédente afin qu'elle soit conforme au besoin du PO d'avoir un argument "fixe".

Et toujours sur une seule 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 d'ajouter un as.numeric étape pour se débarrasser des attributs générés par la fonction scale.

3
agenis