数式または分析からのデータをシミュレートする一般的な方法はありますか?


16

実験計画データフレームからのデータのde novoシミュレーション。
Rに重点を置いて(ただし、他の言語のソリューションは素晴らしいでしょう)。

実験または調査の設計において、データをシミュレートし、このシミュレートされたデータを分析することにより、設計の長所と短所に関する素晴らしい洞察を得ることができます。

このようなアプローチは、統計的テストの理解と適切な使用にも不可欠です。

ただし、このプロセスはやや面倒な傾向があり、多くの場合、実験や調査でこの重要なステップをスキップするようになります。

統計モデルとテストには、データのシミュレーションに必要な情報の大部分が含まれています(分布の仮定または明示的な記述を含む)。

分析モデル(および関連する仮定(例:正常性とバランス)、因子のレベル、および有意性の尺度(p値など)が与えられた場合、シミュレートされたデータ(理想的には、 print()、predict()、simulate())。

このような一般化されたシミュレーションフレームワークは可能ですか?

もしそうなら、そのようなフレームワークは現在利用可能ですか?

例、次のような関数が欲しい

 sim(aov(response~factor1+factor2*factor3),
          p.values=list(factor1=0.05,
                        factor2=0.05,
                        factor3=0.50,
                        factor2:factor3=0.05),
          levels=list(factor1=1:10,
                      factor2=c("A", "B", "C"),
                      factor3=c("A", "B", "C")))

すなわち、次の一般化バージョン:

sim.lm<-function(){
library(DoE.base)
design<-fac.design(nlevels=c(10,3,3),
                   factor.names=c("factor1", "factor2", "factor3"),
                   replications=3,
                   randomize=F)

response<-with(design, as.numeric(factor1)+
                      as.numeric(factor2)+
                      as.numeric(factor3)+
                      as.numeric(factor2)*as.numeric(factor3)+
                      rnorm(length(factor1)))

simulation<-data.frame(design, response)}

または

sim(glm(response~factor1+factor2*factor3, family=poisson),
         p.values=list(factor1=0.05,
                       factor2=0.05,
                       factor3=0.50,
                       factor2:factor3=0.05),
         levels=list(factor1=1:10,
                     factor2=c("A", "B", "C"),
                     factor3=c("A", "B", "C")))

または

  library(lme4)
  sim(lmer(response~factor1+factor2 + (factor2|factor3)),
           F_value=list(factor1=50,
                        factor2=50),
           levels=list(factor1=1:10,
                       factor2=c("A", "B", "C"),
                       factor3=c("A", "B", "C")))

それは完全な対応するdata.frameを作成します

特定の機能の潜在的な例(
自由に編集してください)-arima.sim

モデル化された応答なしで、因子レベルのdata.frameを作成する関数が存在します
。conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html


心に留めておくべきことの1つは、エラー分布を指定する必要があるということです。さらに、「p.values」または「F_value」リストを完全にフォローしていません。Fとpのサンプリング分布はリストされた数値を中心とするという考えですか?
GUNG -復活モニカ

@gung、テストでは分布が仮定されます(ここでは両方とも正規性を仮定するか、glmのようなものを使用する必要があります)。
エティエンヌローデカリー

テストは確かに特定の分布を仮定しないが、それは、データが実際にそのように生成されたことを意味するものではありません。さまざまな目的(シミュレーションスタディ、堅牢性など)のために、任意の数の分布からデータを生成できます。
GUNG -復活モニカ

@gung、質問を編集して、テスト/モデルの期待に対応するデータセットを作成することを明確にしようとしました。私は、シミュレーション研究やロバストネス研究のために何かを探しているのではなく、実験計画のドライランを提供するために探しています。
エティエンヌローデカリー

回答:


10

実際には、simulate必要なデータフレーム(またはその他のリスト)を返すS3ジェネリックもあります。タイプ

?simulate  

クラスlm(glmまたはaovの例でも機能します)およびglm.nb(MASSで)のメソッドが既にあります。これでsimulate、lme4からのオブジェクトなど、オブジェクトの他のクラスのS3 メソッドを作成できます。次のように入力して、メソッドがあるクラスを確認できます。

getAnywhere("simulate.class"), getAnywhere("simulate")  

または

getS3method("simulate","class"), methods(simulate) 

シミュレーションは、それ自体が既にデータまたはシミュレートされたデータを必要とする「適合モデルを表すオブジェクト」を必要としない場合、素晴らしいでしょう。
エティエンヌローデカリエ

>getAnywhere("simulate.class") no object named ‘simulate.class’ was found >getS3method("simulate","class") Error in getS3method("simulate", "class") : S3 method 'simulate.class' not found
エティエンヌローデカリー

2
たとえば、すべての応答値が0である初期適合オブジェクトを常に構築し、適合の係数を目的のパラメーター値に置き換えることができます。次に、「simulate」を使用して、シミュレートされた応答を取得できます。
-NRH

それは本当です。[実験設計タスク](cran.r-project.org/web/views/ExperimentalDesign.html)ビューのパッケージには、ダミー変数セットアップを作成するための多くのパッケージがあります。シミュレーションと実験の設計機能を統合することは素晴らしいことです!
エティエンヌローデカリエ

いくつかのシミュレート機能しかフィットデータを作成しない:stats.stackexchange.com/questions/11233/...
エティエンヌ低Décarie

6

R simfunTeachingDemosパッケージで呼び出される新しい関数があります(現在はR-forgeの開発バージョンでのみ使用できますが、CRANで使用されるまでにはしばらく時間がかかります)。シミュレーションを行う関数の作成を支援することを目的としています。

使用目的の1つは、教師が simfun関数を作成し、それを学生に配布する関数(場合によっては、代替手段としてWebインターフェイスがある場合があります)。その後、学生は実験計画を表す要因のデータフレームを作成し、このデータフレームを作成された関数に渡し、教師が設定したパラメーターとエラー分布に従ってシミュレートされた応答の追加列とともにデータフレームを返します、学生はデータを分析できます。これにより、教師は「真の」関係を設定できますが、生徒は実際の実験を行うよりもはるかに短い時間で「真実」に到達する方法を探求するために、多くの異なる実験デザインを試すことができます。考えられるさまざまな設計を表すさまざまなサンプルデータセットを作成または検索します。

このsimfun機能は、教師/作成者が適合回帰モデル、教師/作成者が提供するパラメーター、または学生/ユーザーが提供するパラメーターに基づいてシミュレーションを行うことができるように柔軟に設計されています。

作成された関数は、シミュレーションで(replicateコマンドを使用して)簡単に使用して、パワー、サンプルサイズ、エフェクトサイズなどを調べることもできます。ただし、結果のシミュレーションは、シミュレーションプロセスを手作業で作成するよりも遅くなります。

あなたは、それはデータを作成するために、p値を取ることはありませんが、使用することを除いて記述するもののようなこのルックスpower.関数やpwr.からpwrパッケージがパワーとアルファを指定するのではなく手段との差異に基づいてシミュレーションを作成するために組み込むことができます。

ヘルプページの例(さらにいくつかの例があります)は、州にネストされた都市にネストされた被験者(男性と女性)の身長を測定していることを前提としています。SDの状態にはランダムな効果があります。 1で、都市(州内)のSDが0.5のランダム効果で、「エラー」SDが3の場合、女性のシミュレーション平均は64インチ、男性の平均は69インチ(エラーSDと平均は現実的です) 、ランダム効果は少し工夫されています)。このsimfun関数は、という新しい関数を作成するために使用されますsimheight。次に、状態ID、都市ID、および被験者の性別の列(実験計画またはサンプリング計画)を含むデータフレームが作成され、simheight そして、適切なツールを使用して分析できる、(他の変数に加えて)シミュレートされた高さを持つ新しいデータフレームの結果。

# simulate a nested mixed effects model
simheight <- simfun({
  n.city <- length(unique(city))
  n.state <- length(unique(state))
  n <- length(city)
  height <- h[sex] + rnorm(n.state,0,sig.state)[state] + 
    rnorm(n.city,0,sig.city)[city] + rnorm(n,0,sig.e)
}, sig.state=1, sig.city=0.5, sig.e=3, h=c(64,69),
  drop=c('sig.state','sig.city','sig.e','h','n.city','n.state','n'))

tmpdat <- data.frame(state=gl(5,20), city=gl(10,10), 
  sex=gl(2,5,length=100, labels=c('F','M')))
heightdat <- simheight(tmpdat)

R-Forgeで新しいTeachingDemosが見つからないようです。
エティエンヌローデカリー

1
install.packages( "TeachingDemos"、repos = " R-Forge.R-project.org"
エティエンヌローデカリエ

試してくださいinstall.packages("TeachingDemos", repos="http://R-Forge.R-project.org")。先頭に「http://」が必要で、「;」は不要です。
グレッグスノー

3

入力するmethods(simulate)か、動作するgetAnywhere("simulate")はずです。パッケージlme4がロードされる場合、前者はいくつかのメソッドを提供します:

[1] simulate.lm * simulate.merMod * simulate.negbin * simulate.polr *

Lmオブジェクトは、lmモデルとglmモデルの両方に使用されます。


2
ありがとう、しかしこれは@Momoの答えのようだ。
エティエンヌローデカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.