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