如何使用optim通过r找到解决方案

如何使用optim通过r找到解决方案,r,optimization,R,Optimization,我有一个很简单的问题,但我似乎无法解决它 我试图用optimr函数找到一个参数 情况如下: library(rootSolve) d <- read.table(text="indx rate n d 1 0.12 158 14 2 0.095 135 9 3 0.057 123 4 4 0.033 115 5 5 0.019

我有一个很简单的问题,但我似乎无法解决它

我试图用optimr函数找到一个参数

情况如下:

library(rootSolve)

d <- read.table(text="indx rate n d 
            1   0.12    158 14
            2   0.095   135 9
            3  0.057    123 4
            4  0.033    115 5
            5    0.019  90  4", header=T)

d$real <- with(d, d/n)

opt <- d[ ,c("rate","real", "n")]

# this is close to the correct solution!

scaler <- apply(opt, 1, function(z) uniroot.all( 
function(alpha) z[2] - (1 / (1 + alpha * ( (1 - z[1]) / z[1] )) ), interval = c(0,10)))

# check for solution (not fully correct!)

round(crossprod(scaler * opt$real, opt$n)/sum(opt$n), 3) == round(crossprod(round(opt$rate, 3), opt$n)/sum(opt$n), 3)


# using optim() - completely wrong results

infun <- function(data, alpha){ l <- with(data, 
( rate - (1 / ( 1 + alpha[1] * ( (1 - real)/real ))) )); return( -sum( l ) ) }

opt_out <- optim(c(0,0), infun, data=opt, method = "BFGS", hessian = TRUE)

with(opt, (1 / ( 1 + opt_out$par[1] * ( (1 - real)/real ))))

您正试图用代码为所有人获得唯一的alpha值,但您希望有五个值。。 所以,你被引导去做一个总数。。但是如果你有负值和正值,你的和可能会接近零,即使个别项远离0

此外,您的infun功能与以前的功能不一致

你能做的就是这样:

infun <- function(alpha){ l <- with(cbind(d, alpha), ( real - (1 / ( 1 + 
alpha * ( (1 - rate)/rate ))) )); return( sum(abs(l)) ) }
param <-  c(5,5,5,5,5)
opt_out <- optim(par = scaler, infun,   method = "BFGS", hessian = TRUE)
为了得到真正的答案,你可以在纸上做一个非常简单的数学题:

sol <- -((opt[,2]-1)/(opt[,2]))*(opt[,1]/(1-opt[,1]))
sol <- -((opt[,2]-1)/(opt[,2]))*(opt[,1]/(1-opt[,1]))
with( cbind(opt,sol), real -1  / ( 1 + opt_out$par * ( (1 - rate)/rate )))