【问题标题】:How to solve a simple optimization in R如何解决R中的简单优化
【发布时间】:2013-09-12 09:00:19
【问题描述】:

我正在尝试使用 R 中的 optim() 函数来解决一个简单的问题,但我在如何实现它时遇到了一些问题:

 e=tot_obs/(sum(Var1)+sum(Var2)+sum(Var3)+sum(Var4))
 output=(Var1+Var2+Var3+Var4)*e

我知道观察结果和所有变量的总数。

# Fake datasets   
# Considering that this are the observations c(1000,250,78,0,0,90)

#Known data
total_observations=1418
var1=c(1,0.3,0.5,0.01,0.05,0.6)
var2=c(500,40,40,0,0,100)
var3=c(1,0.1,0.2,0,0.1,0)
var4=c(2,0.04,0.003,0.003,0,0.05)

#Function
e=total_observations/(sum(var1)+sum(var2)+sum(var3)+sum(var4))
output=(var1+var2+var3+var4)*e

我可以在观察结果和输出之间做一个简单的关联,结果很好 (~0.90)。这个给我 0.97。

但现在我想测试为每个变量分配不同权重的效果。

e=tot_obs/(sum(w1*Var1)+sum(w2*Var2)+sum(w3*Var3)+sum(w4*Var4))
output=(w1*Var1+w2*Var2+w3*Var3+w4*Var4)*e
where w1+w2+w3+w4=1
and cor(observations,output)~1

我试图使用 optim() 函数,但是我完全迷路了。如果有人可以帮助我或为我提供一些关于如何执行此操作的好的参考资料,我将不胜感激。

【问题讨论】:

  • 如果您可以举一个 Var1Var4observations 的示例,它会更容易为您提供帮助,因为他们的类型可能会引导您继续前进。
  • 等等ouput=(Var1+Var2+Var3+Var4) * (observations/(Var1+Var2+Var3+Var4)) 意思是output=observations?
  • 正是@plannapus。尽管输出永远不会等于观测值,因为总会有一些错误或另一个变量丢失。
  • e计算中的Var1Var4output计算中的不一样呢?
  • @plannapus 我没有正确解释我的问题,我添加了假数据并更正了问题的描述。实际上,对于观察结果,我只知道总数,而不是每个值,并且使用变量(对于它们,我知道每个值),我想得出接近观察值的值。

标签: r optimization


【解决方案1】:

您需要在包Rsolnp中使用函数solnp,因为它允许基于相等性的约束。

这个想法是建立一个函数来最小化和你的约束相等函数。

Fun <- function(param){
    e <- total_observations/(sum(param[1]*var1)+sum(param[2]*var2)+sum(param[3]*var3)+sum(param[4]*var4))
    output <- (param[1]*var1 + param[2]*var2 + param[3]*var3 + param[4]*var4)/e
    -cor(output, observations) #We want to maximize cor and therefore minimize -cor
    }

eqn <- function(param){sum(param)}

使用您的示例数据:

observations <- c(1000,250,78,0,0,90)
total_observations=1418
var1=c(1,0.3,0.5,0.01,0.05,0.6)
var2=c(500,40,40,0,0,100)
var3=c(1,0.1,0.2,0,0.1,0)
var4=c(2,0.04,0.003,0.003,0,0.05)

您的优化:

solnp(c(.1,.2,.3,.4),fun=Fun, eqfun=eqn, eqB=1)

Iter: 1 fn: -0.9793  Pars:  0.1395748 0.0008403 0.3881053 0.4714796
Iter: 2 fn: -0.9793  Pars:  0.1395531 0.0008406 0.3881409 0.4714653
solnp--> Completed in 2 iterations
$pars
[1] 0.1395530843 0.0008406453 0.3881409239 0.4714653466

$convergence
[1] 0

$values
[1] -0.9729894 -0.9793458 -0.9793458

$lagrange
             [,1]
[1,] 2.521018e-06

$hessian
           [,1]        [,2]        [,3]        [,4]
[1,]  0.4843670   5.0498894 -0.08329380  0.39560040
[2,]  5.0498894 699.5317385 -2.38763807 -0.65610831
[3,] -0.0832938  -2.3876381  0.91837245 -0.09486495
[4,]  0.3956004  -0.6561083 -0.09486495  0.43979850

$ineqx0
NULL

$nfuneval
[1] 709

$outer.iter
[1] 2

$elapsed
Time difference of 0.2371149 secs

如果您将其保存到变量 res 中,您要查找的内容将存储在 res$pars 中。

【讨论】:

  • 您在我发布答案时修改了您的问题,以表明 Var1 到 Var4 实际上是数字向量。您必须相应地修改此代码。
  • 感谢您的帮助!!
  • 感谢您接受此答案,但我意识到这是错误的,因为条件实际上是 ui %*% param -ci &gt;= 0。我会尽快找到解决方案进行编辑。
  • 不用担心,我正在使用您的答案作为如何实施它的指南。找到解决方案后,您可以进行编辑。
  • @A.R.干得好!事实上,您需要在包Rsolnp 中使用函数solnp,因为它允许基于相等的约束,而对于constrOptim,它必须是不等式。
猜你喜欢
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多