使用 optim 在 R 中进行非线性优化
non-linear optimization in R using optim
我是 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
有什么我错的提示吗?
补充问题:是否有任何其他方法可以使计数数据符合标准分布(伽玛、逆高斯等?)
optim
期望它的第二个参数是一个函数。另外,f
的第二个和第三个参数是固定的,需要指定:
optim(c(50, 1, 2), f, x = x, yexp = yexp)
这也行得通:
optim(c(50, 1, 2), function(p) f(p, x, yexp))
您还可以将 nls
与默认的 Nelder-Mead 算法一起使用:
nls(yexp ~ a * dgamma(x, sh, scale=sc), start = list(a = 50, sh = 2, sc = 1))
或使用 plinear,在这种情况下第一个参数不需要起始值:
nls(c(yexp) ~ dgamma(x, sh, scale=sc), start = list(sh = 2, sc = 1), alg = "plinear")
我是 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
有什么我错的提示吗?
补充问题:是否有任何其他方法可以使计数数据符合标准分布(伽玛、逆高斯等?)
optim
期望它的第二个参数是一个函数。另外,f
的第二个和第三个参数是固定的,需要指定:
optim(c(50, 1, 2), f, x = x, yexp = yexp)
这也行得通:
optim(c(50, 1, 2), function(p) f(p, x, yexp))
您还可以将 nls
与默认的 Nelder-Mead 算法一起使用:
nls(yexp ~ a * dgamma(x, sh, scale=sc), start = list(a = 50, sh = 2, sc = 1))
或使用 plinear,在这种情况下第一个参数不需要起始值:
nls(c(yexp) ~ dgamma(x, sh, scale=sc), start = list(sh = 2, sc = 1), alg = "plinear")