2015-12-09 50 views
3

我正在做一些整合到一個使用integrate循環,我想出了一個我無法理解的錯誤既沒有擺脫。這裏是一個MWE我可以提取:積分:積分可能發散

u_min = 0.06911363 
u_max = 1.011011 
m = 0.06990648 
s = 0.001092265 
integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail = FALSE)}, u_min, u_max) 

這將返回一個錯誤「的Integrale的可能是發散」這顯然是錯誤的。我試圖修改參數一點點,得到了這個工作,例如:

u_min <- 0.07 
u_max <- 1.1 
m <- 0.0699 
s <- 0.00109 
integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail = FALSE)}, u_min, u_max) 

我想看看與debugintegrate功能,但它是一個C代碼的包裝。另外我不是正交技術的專家。我看到這個SO post,但無法從中做出任何事情。

感謝

+0

從'integrate':'像所有的數值積分程序,這些評估上的有限集合點的 功能。如果在幾乎所有的 範圍內該函數是大致恆定的(特別是零),則結果和誤差估計可能是嚴重錯誤的[ ]。你的功能基本上總是0. – nicola

+0

@nicola那麼你會怎麼做不會返回錯誤?我將如何解決這個問題? – Plinth

+0

@Plinth你必須縮小函數不爲零的值周圍的間隔,看看nicola的回答低於 – clemlaflemme

回答

3

需要降低默認容差.Machine$double.eps^0.25(= 0.0001220703)。嘗試,例如,這樣的:

f <- function(v) pnorm(v, mean = m, sd = s, lower.tail = FALSE) 
integrate(f, u_min, u_max, rel.tol = 1e-15) 

## 0.0009421867 with absolute error < 1.1e-17 
1

我會用這個解決方法:

integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail = FALSE)}, 
     max(u_min,m-10*s),min(u_max,m+10*s))$value + (u_min-m+10*s)*(u_min<m+10*s) 

我所做的:

  • pnormlower.tail=FALSE基本上爲零時,很遠就從右側均值。因此,「拉伸」積分的正確極限是毫無意義的。所以,當u_max > m+10*s,你只需要整合到m + 10*s。您當然可以更改10因子來增加精度;
  • 另一方面,在左邊pnorm基本上總是1;所以你可以增加左邊的限制,缺少的部分只是u_min - m+10*s。與上述相同的邏輯。
+0

這確實是一個很好的竅門,我沒有得知區間長度可能會改變估計結果 – clemlaflemme