2015-11-18 62 views
0

任何與此有關的幫助將不勝感激。我正在優化對數正態分佈的參數,以便估計的比例與一組目標值(距離)匹配。使用R公式中的函數

adj_sumifs <- function(sum_array, condition_array, f, m=1){ 
n <- length(condition_array) 
sm = 0 
if (n == length(condition_array)){ 
    fun <- function(x,i){if (f (condition_array[i])){sum_array[i] + x}else{x} } 
    sm <- Reduce(fun,1:n,0) 
} 
ifelse(m <= 0, sm , sm/m) 

}

estimate.inrange <- function(vals,dist,lower,upper,total){ 
    n <- length(lower) 
    if (n == length(upper)){ 
    sapply(1:n, function(i){ ifelse(i < n , 
           adj_sumifs(vals,dist, (function(x) x >= lower[i] && x < upper[i]),total) , 
           adj_sumifs(vals,dist, (function(x) x >= lower[i]) , total) 
          ) } 
     ) 
    }else{ 
    # for a failure in the process 
    as.numeric() 
    } 
} 

而且我想優化的功能是::

calculate_Det_ptns <- function(alpha, beta, pxa, low,up, distances, eF){ 
    temp <- numeric() 
    if (length(pxa) == length(distances) && length(low) == length(up)) 
    { 
    ln_values <- as.numeric(Map(function(pa,d) eF * pa * dlnorm(d, meanlog = alpha, sdlog = beta),pxa,distances)) 
    temp <- estimate.inrange (ln_values,distances,low,up, total = sum(ln_values)) 
    } 
    temp 
} 

優化使用完成的比例使用以下功能計算Levenberg-Marquardt算法

lnVals <- nlsLM(target ~ calculate_Det_ptns(alpha = a,beta = b, pxa = odab,low = low, up = up, distances = dist, eF = expF), 
          start = list(a = mu, b = sd), 
          trace = T) 

凡達,低和目標由相同的數據文件,E,G萃取,

low, up, target 
1,2,0.1 
2,3,0.4 
3,4,0.6 
4,5,0.6 
5,6,0.9 

odabdistance是任意長度的向量(通常比目標要長得多,等)。當目標文件具有150行時,該過程運行良好,並且distancesodab具有大約500000個值。但是,由於我無法理解的原因,目標文件大約有16行時失敗。錯誤消息是:

Error in model.frame.default(formula = ~target + odab + low + up + dist) : 
    variable lengths differ (found for 'odab') 

這表明函數未在公式中進行評估。任何人都可以提出解決方案或解釋?對每一個新的mu和sd重新估算比例是很重要的。

回答

0

你可以嘗試用I()來包圍函數,它會在評估公式之前評估它;然而,我不能用你提供的代碼複製你的問題,因爲我錯過了一些被引用的對象(a,b,odab,dist,expF,mu,sd),所以我不能確認它是否有效。 nVals <- nlsLM(target ~ I(calculate_Det_ptns(alpha = a,beta = b, pxa = odab,low = low, up = up, distances = dist, eF = expF)), start = list(a = mu, b = sd), trace = T)

+0

謝謝,但我()不工作。對象odab和dist基本上是非負值的矢量,具有相似的長度(比如約200K),並且可以隨機生成:0 <= dist <= 500且0 <= odab <= 20。eF可以是任何積極的價值。可以看出,mu和sd只是優化過程的初始值,分別表示對數正態分佈的均值和標準差。微不足道的解決方案是推斷目標函數以獲取更多輸入值/行,但理解此問題的原因(或程度)會很好。 – studNerd