2015-02-09 50 views
2

我是R的新手!使用優化R的非線性優化

我想找到最適合我的實驗計數數據的伽瑪分佈參數。 optim函數的幫助文件說函數的第一個參數應該是要優化的參數。所以,我想:

x = as.matrix(seq(1,20,0.1)) 
yexp = dgamma(x,2,1)*100 + rnorm(length(x),0,1) 
f = function(p,x,yexp) {sum((p[1]*dgamma(x,p[2],scale=p[3]) - yexp)^2)} 
mod = optim(c(50,2,1),f(p,x,yexp)) 

我得到的錯誤信息:

Error in f(p, x, yexp) : object 'p' not found 

任何暗示,我錯了?

問題補充:有沒有其他辦法,以適應標準分配計數數據

+1

[fitdistr](http://stat.ethz.ch/R-manual/R-devel/library/MASS/html/fitdistr.html)? – Roland 2015-02-09 10:59:27

回答

4

optim預計其第二個參數是一個函數(伽馬,逆高斯等?)。此外,第二和第三個參數f是固定的,需要指定:

optim(c(50, 1, 2), f, x = x, yexp = yexp) 

這也將工作:

optim(c(50, 1, 2), function(p) f(p, x, yexp)) 

你也使用nls默認內爾德 - 米德算法:

nls(yexp ~ a * dgamma(x, sh, scale=sc), start = list(a = 50, sh = 2, sc = 1)) 

或與線性在這種情況下,第一個參數不需要起始值:

nls(c(yexp) ~ dgamma(x, sh, scale=sc), start = list(sh = 2, sc = 1), alg = "plinear")