2016-05-08 11 views
1

私は2つのガウス関数を持っていますが、これらの関数にはif-elseステートメントと積分の結果の値を使って分割しています。どちらもかなり早く0になるので、最終的にRがNaNとして返す0/0を取得します。これにより、コードにエラーが発生します。 Rmpfrの精度を上げることとは別に、私は0/0またはNaNという結果になるものをどのように扱うのかと思っていました。R 0/0とNaNを扱うためのトリック

編集:

K(parameters, c(1,1), c(1,1)) 

私は私がであるため、これがあると思い

Error in integrate(Kz, -Inf, Inf, params = params, v. = v., u. = u.) : non-finite function value 

を得る:ここで私は私が実行している場合はより明確にするために

parameters=c(1,1,2) 
R<-function(params,z.){ 
    params[2]*exp(-z.^2/(2*params[3]^2)) 
} 

alpha<-function(params,z.,v.){ 
    1/v.[2]*exp(-(z.-v.[1])^2/(2*v.[2])) 
} 

total.rel.alpha<-function(params,z.,u.){ 
    final=0 
    species.number<-dim(u.)[1] 
    if(is.null(dim(u.))){ 
     return(alpha(params,z.,u.)/R(params,z.)) 
    } 
    for(i in 1:species.number){ 
     final=final+alpha(params,z.,u.[i,]) 
    } 
    return(final/R(params,z.)) 
} 

Kz<-function(params,z.,v.,u.){ 
    if(total.rel.alpha(params,z.,u.)>=0 & total.rel.alpha(params,z.,u.)<=1){ 
     alpha(params,z.,v.) 
    }else if(total.rel.alpha(params,z.,u.)>1){ 
     alpha(params,z.,v.)/total.rel.alpha(params,z.,u.) 
    } 
} 

K<-function(params,v.,u.){ 
    integrate(Kz,-Inf,Inf,params=params,v.=v.,u.=u.)$value 
} 

を使用しているコードがあります私は0/0の合計を得ます.rel.alpha

+1

私はすぐにコーディングにジャンプしていない理由は、本当に問題の説明は、単に失敗したコードがないということです。 'integrate'に渡される関数は、「ベクトル化」する必要があります。関数をベクトル化されたバージョンに変換するのに成功する 'Vectorize'関数があります。 ( 'alpha'関数は既にベクトル化されているように見えます)さらに、Kz関数の本体を実行するだけで、" object 'u'が得られます。それがどのように得られたのかは不明です。 –

+0

K(パラメータ、c(0,1)、c(0,1))は機能します。結果を返します(ただし、警告メッセージが表示されますが、それにもかかわらず結果は返されます)。 – Plinth

+1

だから...問題はほとんど解決?あなたの関数に問題とデータフローを記述するなら、私は警告を取り除く方法を理解することができたと確信しています。私は再開のためにノミネートされました。私は今、十分な具体的な資料があると思うからです。 –

答えて

2

ログとの連携(p1/p2)ここで、p1とp2は問題のガウス密度です。あなたは2次項といくつかの他のものの違いを得るでしょう。

対数をとることは、非常に小さいが非ゼロの確率値を扱うための標準的なアプローチです。

+0

@ 42- ...私の防衛で私は間違いを認識し、私がそれを掲示した後に私のコメントを削除したとしか言えない。それから私はそれを無視して欲しいと頼んだ。 – RHertel

+0

@RobertDodierだから私は(ちょうど追加された)コードを修正して動作させるにはどうすればいいですか? – Plinth

関連する問題