2016-04-10 5 views
2

dnorm(x)とdmvnorm(x)(mvtnormパッケージv1.0.5)は、xが長さ1のときと同じ結果を生成します。しかし、積分関数を使って作業するときは、dmvnorm x)はかなり離れているようです。ここでの例であり、Iは、2つの被積分関数を定義:dmvnormの奇妙な振る舞い

integrand1 <- function(x) 
{ pnorm((-2-sqrt(0.2)*x)/sqrt(0.8))*dmvnorm(x)} 

integrand2 <- function(x) 
{ pnorm((-2-sqrt(0.2)*x)/sqrt(0.8))*dnorm(x)} 

個々の値、integrand1(X)= integrand2(X)で評価します。

しかし、これら二つの機能に沿って統合は全く異なる結果を生成する:

integrate(integrand1,lower = -10,upper = 10)$value 
[1] 7.567463e-236 

integrate(integrand2,lower = -10,upper = 10)$value 
[1] 0.02275013 

同様の現象はまた、曲線機能について観察されます。それがバグかどうか不思議に思うだけです。

+2

'dmvnorm(matrix(x))'を使用する – user20650

+1

'dnorm(1:10)'と 'dmvnorm(1:10)'を試しましたか?彼らがなぜ違うのか理解していますか? 'dmvnorm(1:10)'が基本的に 'prod(dnorm(1:10))'に等しいのはなぜですか? – nicola

+1

ありがとう、@ user20650。 dmvnorm(matrix(x))は問題を解決します。 – Lamothy

答えて

2

これはバグではありません。 dmvnorm関数は、多変量の密度分布関数を評価することを期待しており、dnormは単一変量分布を扱います。例を見てみましょう:

dnorm(1:5) 
#[1] 2.419707e-01 5.399097e-02 4.431848e-03 1.338302e-04 1.486720e-06  
dmvnorm(1:5) 
#[1] 1.151999e-14 

まず違い:単一の値dmvnormながら、長さ5のベクトルを返しますdnorm

dmvnormと基本的に同じ値が返されます。要するに、これらの差である:

  • dnorm(1:5)は、その後2、3、4および5平均0と標準偏差1としたがって、我々は5つの値を有する、1に正規分布の密度を評価します。
  • dmvnormは、多変量分布を処理するように作られています。ここでは、第1の変数が1であり、第2の変数が2であるというように、5変量多変量(いずれも1:5、すなわち長さ5のベクトルを提供しているので)の密度であるかどうかを調べる。平均は全てゼロであり、共分散行列はdiag(5)、すなわち5次元単位行列である。指定していないので、どちらもデフォルト値です。 ?dmvnormを参照してください。後者の場合

、5つの変数は、独立あるので、密度は5つの独立した(単変量)正規分布1において、2、3、4および5

の積であります一変量分布を扱う場合はdnorm、それ以外の場合はdmvnormを使用してください。

+1

ありがとう、@ニコラ。これは非常に役に立ちます! – Lamothy

+0

ありがとう、@ニコラ。私はまた、ランタイムの点では、長さ(x)> 1のときにprod(dnorm(x))がdmvnorm(x)よりもはるかに高速に見えることに気付きました。あなたはパフォーマンスの違いについていくつかの光を共有することはできますか? – Lamothy