优化函数仅用于处理我理解的一个函数参数。 但有时函数可能依赖于变量和参数的不同输入范围。
例如:
x.r<-rnorm(100)
y<-function(x,p) -x^2+p*1/exp(x^3)
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1])
x.r。传递给y的x的域可以从样本变为样本。而不是使用泛型x,我希望能够从许多x.r值的域中绘制来运行y。有没有办法修改优化函数,以便我可以传递y,函数和x它的域变量以及优化参数p?
上面我得到一个错误:
> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1])
Error in p * 1 : 'p' is missing
编辑: 根据以下建议(这是有道理的......但) 我试过了。
x.r<-rnorm(100)
p<-seq(-5,5,1)
y<-function(x,p) -x^2+p*1/exp(x^3)
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p)
结果是: p * 1出错:'p'缺失
此外,
> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p,x.r)
Error in optimize(y, upper = range(x.r)[2], lower = range(x.r)[1], p, :
invalid function value in 'optimize'
还有其他想法吗?
编辑2: 下面的评论循环可行,但似乎是一个奇怪的方法来接近它。 我不确定它是否也将x.r域考虑在内。
x.r<-rnorm(100)
p<-seq(-5,5,1)
y<-function(p=p,x=x.r) -x^2+p*1/exp(x^3)
for(v in p){
print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))}
> for(v in p){
+ print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))}
$minimum
[1] -4.999944
$objective
[1] -9.637547e+54
$minimum
[1] -4.999944
$objective
...
答案 0 :(得分:3)
我通过p
致电optimise
x.r <- rnorm(100)
p <- seq(-5,5,1)
y<-function(x,p) -x^2+ p/exp(x^3)
ll <- lapply(p,function(i)
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p=i))
ll[[which.min(sapply(ll,'[[','minimum'))]]
$minimum
[1] -2.14628
$objective
[1] -98357.67
当然如果maximum = TRUE
最后成为
ll[[which.max(sapply(ll,'[[','maximum'))]]
答案 1 :(得分:1)
除此之外的另一种方法,即使你调用的东西不允许你指定传递给函数的额外命名参数,也可以创建一个函数生成函数,该函数生成一个给定p的函数
yp <- function(p){force(p);function(x){-x^2+p*1/exp(x^3)}}
yp1=yp(1)
yp2=yp(2)
现在yp
函数只是x的函数:
> yp1(0)
[1] 1
> yp2(0)
[1] 2
所以你的循环变成了:
x.r <- rnorm(100)
pv <- seq(-5,5,1)
ll <- lapply(pv,function(p){
Y = yp(p)
optimize(Y,upper=range(x.r)[2],lower=range(x.r)[1])
})
循环遍历pv
向量,并将每个值放入p
以根据该值创建函数Y
。除了upper
和lower
之外,其他任何内容都不会传递到optimize
。