Ответ 1
Поскольку вы попросили один-лайнер:
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
mean(r) ## 4
sd(r) ## 1
При генерации случайных чисел в R с помощью rnorm
(или runif
и т.д.) они редко имеют точное среднее значение и SD в качестве распределения, от которого они берутся. Есть ли простой один-два-лайнер, который делает это для меня? В качестве предварительного решения я создал эту функцию, но кажется, что она должна быть родной для R или некоторого пакета.
# 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)
}
Чтобы проиллюстрировать:
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
Причина, по которой я хочу, это то, что я корректирую свой анализ на моделируемых данных, прежде чем применять его к реальным данным. Это хорошо, потому что с имитированными данными я знаю точные свойства (средства, SD и т.д.), И я избегаю инфляции p-value, потому что я делаю выводную статистику. Я спрашиваю, есть ли что-то простое, например, например.
rnorm(n=20, mean=5, sd=10, fixed=TRUE)
Поскольку вы попросили один-лайнер:
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
mean(r) ## 4
sd(r) ## 1
Это улучшает функцию, предложенную в предыдущем ответе, так что она соответствует потребности OP в наличии "фиксированного" аргумента.
И все еще в одной строке; -)
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
Я решил ввести значения по умолчанию для каждого аргумента и добавить шаг as.numeric
, чтобы избавиться от атрибутов, сгенерированных функцией scale
.