26

rnorm(またはその他を使用して)Rで乱数を生成する場合runif、サンプリング元の分布として正確な平均とSDを持つことはめったにありません。私のためにこれを行う簡単な1つまたは2つのライナーはありますか? 予備的な解決策として、この関数を作成しましたが、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 値のインフレを回避できるため、これは素晴らしいことです。たとえば、次のような単純なものがあるかどうかを尋ねています

rnorm(n=20, mean=5, sd=10, fixed=TRUE)
4

3 に答える 3

40

ワンライナーを要求したので:

rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
mean(r)  ## 4
sd(r)    ## 1
于 2013-09-20T16:10:34.523 に答える
3

これは、以前の回答で提案された関数の改良であり、「固定」引数を持つという 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

于 2016-09-22T20:46:35.083 に答える