能否在R中向 optimize() 函数传递更多参数?

5

据我了解,optimize函数仅设计用于处理一个函数参数。 但有时函数可能取决于变量和参数的不同输入范围。

例如:

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.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
...

1
尝试类似于 optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p=some_variable) 的东西,其想法是在末尾添加 p 参数,并将任何想要的变量传递给它。 - iTech
我进行了编辑尝试。我也尝试了几种变体(包括将p作为y的第一个参数,因为优化默认抓取第一个参数)。我试图获得的关键是将不同的x域传递给优化函数。 - pat
你应该添加参数为 p=3,例如。 - iTech
@pat 我认为你需要为每个p调用optimize函数。 - agstudy
@iTech 那个方法可以用,但是对我来说没有意义。我想找到所有可能的p值中哪一个值能够给出最优解(给定f(p,x),其中x是定义域范围)。这不是只返回给定1个p值的结果吗?@agstudy...也许就是这样。那么我需要一个循环来实现它吗?我希望有一个简单的基于向量的方法。 - pat
2个回答

3

我调用 optimise 对 p 进行优化。

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

另一个解决办法是创建一个生成函数的函数,该生成函数可以生成具有给定参数的函数,即使您调用的函数不允许您指定传递给函数的额外命名参数。

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中。请保留html标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接