特定の平均値や標準偏差など、特定の制約を満たすデータをシミュレートする方法は?


56

この質問は、メタ分析に関する私の質問に基づいています。しかし、既存の公開されたデータセットを正確に反映するデータセットを作成したいコンテキストを教えるのにも役立つと思います。

特定の分布からランダムデータを生成する方法を知っています。たとえば、次のような研究の結果について読んだ場合:

  • 平均102
  • 5.2の標準偏差、および
  • サンプルサイズは72です。

rnormR を使用して同様のデータを生成できます。たとえば、

set.seed(1234)
x <- rnorm(n=72, mean=102, sd=5.2)

もちろん、平均とSDはそれぞれ102と5.2に正確には等しくありません。

round(c(n=length(x), mean=mean(x), sd=sd(x)), 2)
##     n   mean     sd 
## 72.00 100.58   5.25 

一般的に、一連の制約を満たすデータをシミュレートする方法に興味があります。上記の場合、制約はサンプルサイズ、平均、標準偏差です。他の場合には、追加の制約があるかもしれません。例えば、

  • データまたは基になる変数の最小値と最大値がわかっている場合があります。
  • 変数は整数値のみ、または非負の値のみをとることがわかっている場合があります。
  • データには、相互相関が既知の複数の変数が含まれる場合があります。

ご質問

  • 一般に、一連の制約を正確に満たすデータをどのようにシミュレートできますか?
  • これについて書かれた記事はありますか?Rにこれを行うプログラムはありますか?
  • 例のために、特定の平均値とsdを持つように変数をどのようにシミュレートできますか?

1
公開された結果とまったく同じにしたいのはなぜですか?データのサンプルを考えると、これらの母平均および標準偏差の推定値ではありません。これらの推定値に不確実性がある場合、上記のサンプルが観測と一致しないと言うのは誰ですか?
ギャビンシンプソン

4
この質問はマーク(IMHO)を欠く返信を収集しているように見えるので、概念的に答えは簡単であると指摘したいと思います:等式制約は周辺分布のように扱われ、不等式制約は切り捨ての多変量類似物です。切り捨ての処理は比較的簡単です(多くの場合、拒否サンプリングを使用)。より難しい問題は、これらの周辺分布をサンプリングする方法を見つけることになります。これは、分布と制約が与えられた周辺のサンプリング、または周辺分布を見つけてそこからサンプリングするために統合することを意味します。
whuber

4
ところで、最後の質問は、ロケーションスケールの配信ファミリにとっては簡単です。たとえば、x<-rnorm(72);x<-5.2*(x-mean(x))/sd(x)+102トリックを行います。
whuber

1
@whuber、枢機inalが私の答えへのコメント(この「トリック」に言及している)と別の答えへのコメントで言及しているように-この方法は、一般的に、あなたが分割しているので、同じ分布ファミリー内の変数を保持しませんサンプルの標準偏差による。
マクロ

5
@Macroこれは良い点ですが、おそらく最良の返事は「もちろん、彼らは同じ分布を持たないでしょう」です!必要な分布は、制約条件付きの分布です。一般的に、それは親ディストリビューションと同じファミリーのものではありません。たとえば、正規分布から平均0とSD 1で抽出されたサイズ4のサンプルの各要素は、[-1.5、1.5]でほぼ一定の確率を持つことになります。これは、条件によって可能な値に上限と下限が設定されるためです。
whuber

回答:


26

一般に、サンプルの平均と分散を事前に指定された値と正確に一致させるには、変数を適切にシフトおよびスケーリングできます。具体的には、がサンプルの場合、新しい変数X1,X2,...,Xn

Zi=c1(XiX¯sX)+c2

ここで、はサンプル平均で、は、のサンプル平均が正確にあり、そのサンプル分散が正確に。同様に構成された例では、範囲を制限できます-s 2 X =1X¯=1ni=1nXiZIC2C1sX2=1n1i=1n(XiX¯)2Zic2c1

Bi=a+(ba)(Ximin({X1,...,Xn})max({X1,...,Xn})min({X1,...,Xn}))

間隔制限されたデータセットを生成します。 B1,...,Bn(a,b)

注:これらのタイプのシフト/スケーリングは、元のデータがロケーションスケールファミリに由来する場合でも、一般に、データの分布ファミリを変更します。

コンテキスト内で正規分布mvrnorm関数は、R あなたが事前に指定したデータの正常(または通常の多変量)をシミュレートすることができ、サンプルが設定して/共分散を意味しますempirical=TRUE。具体的には、この関数は、サンプル平均と(共)分散が事前に指定された値に等しい場合、正規分布変数の条件付き分布からのデータをシミュレートします。@whuberが主な質問へのコメントで指摘したように、結果の周辺分布は正規ではないことに注意してください。

サンプルの平均(サンプルから)が0に制限され、サンプルの標準偏差が1 である単純な単変量の例です。最初の要素は正規分布よりも均一分布にはるかに似ていることがわかります。分布:n=4

library(MASS)
 z = rep(0,10000)
for(i in 1:10000)
{
    x = mvrnorm(n = 4, rep(0,1), 1, tol = 1e-6, empirical = TRUE)
    z[i] = x[1]
}
hist(z, col="blue")

                  ここに画像の説明を入力してください


1
サンプルサイズが大きいので、もし彼らが約かもしれないが、通常、配布されません。@Seanの回答に対する最初のコメントは、これを暗示しています。Zi
枢機

1
まあ、それは...やりたいために、かなり自然なことだとしばしば発生しない、あまりにも多くの問題を。
枢機

1
+1。例では、ユニフォームが正確な答えです。(プロットの端での見かけ上のドロップオフは、Rがヒストグラムを描画する方法のアーティファクトです。)
whuber

1
@whuber、この例を動機付けてくれてありがとう。サンプルの平均/分散を条件にすると、周辺分布が変化するという事実を考えると、OPの質問の精神における最良の「答え」は、サンプルとして報告されたものと等しい母平均/分散でデータをシミュレートすることであるようです量(OP自身が示唆した)、そうではありませんか?そうすれば、必要な量に「類似した」サンプル量が得られ、周辺分布が望みどおりになります。
マクロ

1
@whuber、サンプルが正常な場合、には分布がありますか?問題の「新しい」変数は、線形結合にます。Ti=(XiX¯)/stTi
マクロ

22

論文のリクエストについては、次のとおりです。

これは、あなたが探しているものとはまったく異なりますが、工場のグリストとして役立つかもしれません。


誰も言及していないように見える別の戦略があります。残りのデータが適切な値に固定されている限り、セット全体が制約を満たすように、サイズセットから(擬似)ランダムデータを生成することができます。必要な値は、方程式、代数、およびいくつかのエルボーグリースのシステムで解ける必要があります。 NkNkkk

たとえば、与えられたサンプル平均と分散を持つ正規分布からデータのセットを生成するには、と 2点の値を修正する必要があります。サンプルの平均は次のとおりです。は、なければなりません サンプル分散: したがって(上記に置き換えた後、フォイル/配布、および再配置... ) 我々が得る: Nx¯s2yz

x¯=i=1N2xi+y+zN
y
y=Nx¯(i=1N2xi+z)
s2=i=1N2(xix¯)2+(yx¯)2+(zx¯)2N1
y
2(Nx¯i=1N2xi)z2z2=Nx¯2(N1)+i=1N2xi2+[i=1N2xi]22Nx¯i=1N2xi(N1)s2
を取る場合、、およびをRHSの否定として、2次式を使用してを解くことができます。たとえば、では、次のコードを使用できます。 a=2b=2(Nx¯i=1N2xi)czR
find.yz = function(x, xbar, s2){
  N    = length(x) + 2
  sumx = sum(x)
  sx2  = as.numeric(x%*%x)          # this is the sum of x^2
  a    = -2
  b    = 2*(N*xbar - sumx)
  c    = -N*xbar^2*(N-1) - sx2 - sumx^2 + 2*N*xbar*sumx + (N-1)*s2
  rt   = sqrt(b^2 - 4*a*c)

  z    = (-b + rt)/(2*a)
  y    = N*xbar - (sumx + z)
  newx = c(x, y, z)
  return(newx)
}

set.seed(62)
x    = rnorm(2)
newx = find.yz(x, xbar=0, s2=1)
newx                                # [1] 0.8012701  0.2844567  0.3757358 -1.4614627
mean(newx)                          # [1] 0
var(newx)                           # [1] 1

このアプローチについて理解すべきことがいくつかあります。まず、動作が保証されていません。たとえば、初期のデータは、結果セットの分散を等しくする値およびが存在しないようなものである可能性があります。考慮してください: N2yzs2

set.seed(22)    
x    = rnorm(2)
newx = find.yz(x, xbar=0, s2=1)
Warning message:
In sqrt(b^2 - 4 * a * c) : NaNs produced
newx                                # [1] -0.5121391  2.4851837        NaN        NaN
var(c(x, mean(x), mean(x)))         # [1] 1.497324

第二に、標準化はすべての変量の周辺分布をより均一にしますが、このアプローチは最後の2つの値にのみ影響しますが、周辺分布は歪められます:

set.seed(82)
xScaled = matrix(NA, ncol=4, nrow=10000)
for(i in 1:10000){
  x           = rnorm(4)
  xScaled[i,] = scale(x)
}

(プロットを挿入)

set.seed(82)
xDf = matrix(NA, ncol=4, nrow=10000)
i   = 1
while(i<10001){
  x       = rnorm(2)
  xDf[i,] = try(find.yz(x, xbar=0, s2=2), silent=TRUE)  # keeps the code from crashing
  if(!is.nan(xDf[i,4])){ i = i+1 }                      # increments if worked
}

(プロットを挿入)

第三に、結果のサンプルは非常に正常に見えない場合があります。それは本質的にそうであるため、「外れ値」(つまり、他とは異なるデータ生成プロセスから得られるポイント)があるように見えるかもしれません。これは、生成されたデータからのサンプル統計が必要な値に収束する必要があるため、調整が少なくて済むため、サンプルサイズが大きい場合に問題になる可能性は低くなります。より小さいサンプルでは、​​生成されたサンプルが許容範囲外の形状統計(歪度や尖度など)を持っている場合に再試行する受け入れ/拒否アルゴリズムとこのアプローチを常に組み合わせることができます(@cardinalのコメントを参照)固定平均、分散、歪度、および尖度(代数はあなたにお任せします)。または、少数のサンプルを生成し、最小の(たとえば)Kolmogorov-Smirnov統計を持つサンプルを使用することもできます。

library(moments)
set.seed(7900)  
x = rnorm(18)
newx.ss7900 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss7900)                       # [1] 1.832733
kurtosis(newx.ss7900) - 3                   # [1] 4.334414
ks.test(newx.ss7900, "pnorm")$statistic     # 0.1934226

set.seed(200)  
x = rnorm(18)
newx.ss200 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss200)                        # [1] 0.137446
kurtosis(newx.ss200) - 3                    # [1] 0.1148834
ks.test(newx.ss200, "pnorm")$statistic      # 0.1326304 

set.seed(4700)  
x = rnorm(18)
newx.ss4700 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss4700)                       # [1]  0.3258491
kurtosis(newx.ss4700) - 3                   # [1] -0.02997377
ks.test(newx.ss4700, "pnorm")$statistic     # 0.07707929S

(プロットを追加)


10

一般的な手法は「拒否方法」で、制約を満たさない結果のみを拒否します。何らかの種類のガイダンス(MCMCなど)がない限り、(シナリオに応じて)拒否される多くのケースを生成する可能性があります。

平均や標準偏差のようなものを探していて、目標からどれだけ離れているかを示す何らかの距離メトリックを作成できる場合、最適化を使用して、目的の出力を提供する入力変数を検索できます値。

醜い我々は= 0の平均および標準偏差= 1を有する長さ100を有するランダム均一なベクトルを検索します例。

# simplistic optimisation example
# I am looking for a mean of zero and a standard deviation of one
# but starting from a plain uniform(0,1) distribution :-)
# create a function to optimise
fun <- function(xvec, N=100) {
  xmin <- xvec[1]
  xmax <- xvec[2]
  x <- runif(N, xmin, xmax)
  xdist <- (mean(x) - 0)^2 + (sd(x) - 1)^2
  xdist
}
xr <- optim(c(0,1), fun)

# now lets test those results
X <- runif(100, xr$par[1], xr$par[2])
mean(X) # approx 0
sd(X)   # approx 1

7
確率ゼロで発生する制約を満たすことは困難です。;-)手元の具体例については、適切なシフトと拡張が簡単に実現述べ 1は、データの分布は、このような操作により乱されるかを見て少し深く分析したいかもしれませんが、目標を。
枢機

ありがとう。確かに、最小値よりも小さく最大値よりも大きい観測値を拒否するのは簡単です。そして、それを最適化問題としてどのように定義できるかを見ることができます。いくつかの例を見るか、次に読むべきもののいくつかの提案があるかもしれません。
ジェロミーアングリム

1
@cardinal-同意しました。入力シミュレーション数と出力の両方の分布(ヒストグラム)を見る必要があります。これらは非常に奇妙に見える場合があるためです!
ショーン

9

Rにこれを行うプログラムはありますか?

Runuran Rパッケージにはランダム変量を生成するための多くの方法が含まれています。UNU.RAN(Universal Non-Uniform Random Number generator)プロジェクトのCライブラリを使用します。ランダム変量生成の分野に関する私自身の知識は限られていますが、Runuran ビネットは素晴らしい概要を提供します。以下は、ビネットから取られたRunuranパッケージで利用可能なメソッドです。

連続分布:

  • 適応除去サンプリング
  • 逆変換密度除去
  • 逆CDFの多項式補間
  • 単純な均一比法
  • 変換された密度除去

離散分布:

  • 離散自動拒否反転
  • Alias-Urnメソッド
  • 離散反転のガイドテーブル法

多変量分布:

  • 均一比法を使用したHit-and-Runアルゴリズム
  • 多変量ナイーブ均一比法

例:

簡単な例として、0〜100の範囲の正規分布を生成するとします。

require("Runuran")

## Normal distribution bounded between 0 and 100
d1 <- urnorm(n = 1000, mean = 50, sd = 25, lb = 0, ub = 100)

summary(d1)
sd(d1)
hist(d1)

このurnorm()関数は便利なラッパー関数です。舞台裏では、CDFの多項式補間法を使用していると思いますが、確信はありません。より複雑なものについては、たとえば、0から100の範囲の離散正規分布です:

require("Runuran")

## Discrete normal distribution bounded between 0 and 100
# Create UNU.RAN discrete distribution object
discrete <- unuran.discr.new(pv = dnorm(0:100, mean = 50, sd = 25), lb = 0, ub = 100)

# Create UNU.RAN object using the Guide-Table Method for Discrete Inversion
unr <- unuran.new(distr = discrete, method = "dgt")

# Generate random variates from the UNU.RAN object
d2 <- ur(unr = unr, n = 1000)

summary(d2)
sd(d2)
head(d2)
hist(d2)

3

昨日公開された要件を満たすRパッケージがあるようです! simstudyキース・ゴールドフェルド

データセットをシミュレートして、モデリング手法を調べたり、データ生成プロセスをよりよく理解したりします。ユーザーは共変量間の関係のセットを指定し、これらの仕様に基づいてデータを生成します。最終データセットは、無作為化対照試験、反復測定(縦断的)設計、およびクラスター無作為化試験からのデータを表すことができます。欠落は、さまざまなメカニズム(MCAR、MAR、NMAR)を使用して生成できます。


1
ビネットにも、プログラムのホームページにも、制約の厳密なミーティングは記載されていません。このパッケージが条件付き分布から描画する要件を満たしていると思うのはなぜですか?
gg

2

これは非常に遅い回答であり、おそらく意味がありませんが、質問に対するMCMCソリューションは常に存在します。つまり、制約によって定義された多様体上のサンプルのジョイント密度を投影するには、たとえば 唯一の問題は、その多様体上の値をシミュレートすること、つまり、正しい次元のパラメーター化を見つけることです。2015紙 Bornn、シェパードとSolgiの研究によって、(この非常に問題ではない、究極の答えであれば、興味深いです)。

i=1nf(xi)
i=1nxi=μ0i=1nxi2=σ02

2

この回答は、変量を強制的に指定範囲内に配置し、さらに平均および/または分散を決定する場合の別のアプローチを検討しています。

単位間隔注意を制限します。一般化のために加重平均を使用しましょう。いくつかの重みをで修正するか、標準の重みが必要な場合は設定します。量およびは、それぞれ目的の(加重)平均および(加重)分散を表すと仮定します。上の上限それは、単位区間上で可能な最大の分散だから必要があります。これらのモーメント制限を、からいくつかの変量を描画することに興味があります。[0,1]wk[0,1]k=1Nwk=1wk=1/Nμ(0,1)0<σ2<μ(1μ)σ2x1,...,xN[0,1]

最初に、などの分布からいくつかの変量します。この分布は、最終的な分布の形状に影響します。次に、ロジスティック関数を使用して、単位間隔に制限します。y1,...,yNN(0,1)[0,1]

xk=11+e(ykvh)

ただし、それを行う前に、上記の式に見られるように、平行移動とスケールを変換します。これは、@ Macroの答えの最初の方程式に類似しています。ここは変換された変数が希望するモーメントを持つようにとを選択することです。つまり、次のいずれかまたは両方を保持する必要があります。 ykhvhvx1,...,xN

μ=k=1Nwk1+e(ykvh)σ2=k=1Nwk(1+e(ykvh))2(k=1Nwk1+e(ykvh))2

とこれらの方程式を解析的に逆にすることは実行できませんが、特にとに関する微分は計算が簡単なので、数値的に行うのは簡単です。ニュートンの方法を数回繰り返すだけです。vhvh

最初の例として、分散ではなく重み付き平均の制約のみを考慮しているとします。、、、修正します。次に、基礎となる分布、およびについて、それぞれ次のヒストグラムが得られ、変量の平均は正確に(小さなでも):μ=0.8v=1wk=1/NN=200000N(0,1)N(0,0.1)Unif(0,1) 0.8N

例1

次に、平均と分散の両方を制約しましょう。テイク、、と3つの希望の標準偏差を検討。同じ基礎となる分布を使用して、それぞれのヒストグラムを次に示します。μ=0.2wk=1/NN=2000σ=0.1,0.05,0.01N(0,1)

例2

これらは少しベータ配布されているように見えるかもしれませんが、そうではないことに注意してください


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.