任何與此有關的幫助將不勝感激。我正在優化對數正態分佈的參數,以便估計的比例與一組目標值(距離)匹配。使用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
而odab
和distance
是任意長度的向量(通常比目標要長得多,等)。當目標文件具有150行時,該過程運行良好,並且distances
和odab
具有大約500000個值。但是,由於我無法理解的原因,目標文件大約有16行時失敗。錯誤消息是:
Error in model.frame.default(formula = ~target + odab + low + up + dist) :
variable lengths differ (found for 'odab')
這表明函數未在公式中進行評估。任何人都可以提出解決方案或解釋?對每一個新的mu和sd重新估算比例是很重要的。
謝謝,但我()不工作。對象odab和dist基本上是非負值的矢量,具有相似的長度(比如約200K),並且可以隨機生成:0 <= dist <= 500且0 <= odab <= 20。eF可以是任何積極的價值。可以看出,mu和sd只是優化過程的初始值,分別表示對數正態分佈的均值和標準差。微不足道的解決方案是推斷目標函數以獲取更多輸入值/行,但理解此問題的原因(或程度)會很好。 – studNerd