Générer des nombres aléatoires avec une 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, ils sont échantillonnées à partir de. Est-il simple-ou-deux-liner qui fait cela pour moi? Comme une solution préliminaire, j'ai créé cette fonction, mais il semble comme quelque chose qui devrait être natif de R ou 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 c'est que j'ai régler mon analyse sur données simulées avant de l'appliquer à des données réelles. C'est sympa car avec des données simulées je sais que les propriétés exactes (les moyens, Sdd, etc.) et j'évite de la p-valeur de l'inflation, car je suis en train de faire des statistiques inférentielles. Je me demande si il existe quelque chose de simple comme par exemple

rnorm(n=20, mean=5, sd=10, fixed=TRUE)
Vous pouvez utiliser la fonction scale pour ce faire... mais n'est-ce pas exactement illustrant la différence entre l'échantillon et les statistiques sur la population? Comme votre n est grande sd(x) et mean(x) approche les valeurs que vous avez fourni, mais à seulement 20 échantillons ne vous attendez pas parfait distribution...
Par curiosité, pourquoi avez-vous besoin? Je ne m'attends pas à un échantillon de manière à avoir la même moyenne et sd de la population.
Je pense que vous avez vu juste. Je pense que c'est suffisamment simple pour que les gens juste comme ça quand ils ont besoin. MASS::mvrnorm possède un analogue de la fonctionnalité (mais elle est légèrement plus délicat pour le multivariée cas, ce qui est probablement pourquoi il est intégré). D'accord avec @Justin que vous pouvez utiliser mu+sigma*scale(rnorm(n)) comme un one-liner ...
Justin et Roland: j'ai ajouté ma motivation dans la question 🙂 C'est parce que je simuler des données et que vous souhaitez connaître ses propriétés! Donc oui, si je voulais que cela représente le monde réel, ces contraintes serait étrange. Mais je veux un "parfait petit monde" à jouer autour de, afin de savoir si je fais la part des choses 🙂
J'ai l'habitude de simplement créer un échantillon et calculer les propriétés.

OriginalL'auteur Jonas Lindeløv | 2013-09-20