probabilidad - Generar números aleatorios con media fija y sd
probabilidad binomial en r (2)
Desde que pediste una sola línea:
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
mean(r) ## 4
sd(r) ## 1
Cuando se generan números aleatorios en R usando rnorm
(o runif
etc.), rara vez tienen la media exacta y SD como la distribución de la que se toman muestras. ¿Hay algún simple o dos liners que haga esto por mí? Como solución preliminar, he creado esta función pero parece ser algo que debería ser nativo de R o algún paquete.
# 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)
}
Para ilustrar:
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 razón por la que quiero esto es que ajuste mi análisis en datos simulados antes de aplicarlo a datos reales. Esto es bueno porque con los datos simulados conozco las propiedades exactas (medios, SD, etc.) y evito la inflación de valor p porque estoy haciendo estadísticas inferenciales. Estoy preguntando si existe algo simple como por ejemplo
rnorm(n=20, mean=5, sd=10, fixed=TRUE)
Esta es una mejora de la función sugerida en una respuesta anterior para que cumpla con la necesidad del OP de tener un argumento "fijo".
Y aún en una línea ;-)
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
Elegí ingresar valores predeterminados para cada argumento y agregar un paso as.numeric
para deshacerme de los atributos generados por la función de scale
.