r - 约束优化 [Maxima] R
问题描述
我正在尝试解决以下受约束的最大化问题。
这里的例子只是我试图重新创建一个简单的例子。
我有一个数据框如下:
Obs=c(1,2,3,4,5)
Var1=c(11,15,16,19,20)
Var2=c(1.5,22,0.9,1.7,.1)
Var3=c(2.6,2.5,3.5,3.6,2.1)
Value_One = c(10,12.5,8.4,7.5,2.6)
Cost = c(1.1,1.2,1.3,1.6,1.7)
Value_overall = c(10,21,31,4,29)
df=data.frame(Obs,Var1,Var2,Var3,Value_One,Cost,Value_overall)
var_sel=c('Var1','Var2')
coeff_sel=c(2.5,4.5)
gamma=.7
我必须运行一个受约束的优化问题,其示例如下(请注意确切的值,不要紧。请随意更改它们):
Value_func = function(x){
Value_var=x$Cost
# - since the contrained optimum function is for minima.
-((x$Value_overall+gamma*(x$Value_null-
(as.matrix(x[var_sel])%*%(as.matrix(coeff_sel)))))-2*x[Cost])
}
#Please feel free to change the values below.
#I just want to know where I am going wrong. The exact values do not matter here.
for (i2 in 1:nrow(df)){
x=df[i2,]
zzz=constrOptim(-1.2, Value_func, NULL,ui=1,ci=-1.3)
}
我想要做的是为数据框的每一行运行上述内容。当我运行上面的示例时,我收到以下错误:
Error: $ operator is invalid for atomic vectors
Called from: f(theta, ...)
我试图寻找一个解决方案,这就是我得到的,但它似乎不适用于我的情况(R $ 运算符对 constraOptim 中的原子向量无效)。
请帮忙。提前致谢。
解决方案
这使得结果没有错误。对代码的更改包括:
- 添加
Value_null
到 data.frame - 将函数参数更改为
costs
并在矩阵填充后修改函数。 - 将结果保存
zzz
为列表而不是静态。
如果您首先将其设计为矩阵,则可以使用 apply。
df <- data.frame(Obs=c(1,2,3,4,5)
,Var1=c(11,15,16,19,20)
,Var2=c(1.5,22,0.9,1.7,.1)
,Var3=c(2.6,2.5,3.5,3.6,2.1)
,Value_One = c(10,12.5,8.4,7.5,2.6)
,Cost = c(1.1,1.2,1.3,1.6,1.7)
,Value_overall = c(10,21,31,4,29)
#added to match
,Value_null = 5
)
var_sel=c('Var1','Var2')
coeff_sel=c(2.5,4.5)
gamma=.7
Value_func = function(costs){
# - since the contrained optimum function is for minima.
-((x$Value_overall+gamma*(x$Value_null-
(as.matrix(x[var_sel])%*%(as.matrix(coeff_sel)))))-2*costs)
}
for (i2 in 1:nrow(df)){
x=df[i2,]
zzz[[i2]]=constrOptim(1, Value_func, NULL,ui=1,ci=-1.3, x$Cost)
}
或者apply
方法。我不喜欢我分配的x <<- z
,但它给出了结果。
Value_func = function(costs){
# - since the contrained optimum function is for minima.
-((x['Value_overall']+gamma*(x['Value_null']-
(x[var_sel]%*%(coeff_sel))))-2*costs)
}
apply(df, 1, function(z) {
x<<- z
constrOptim(1, Value_func, NULL, ui = 1, ci = -1.3, z['Cost'])
}
)
推荐阅读
- c - 这两种结构用法之间的区别
- python - Insert ... ON DUPLICATE KEY INSERT 新的东西
- python - botocore.exceptions.clienterror 调用copyobject操作时发生错误(keyTooLongError)
- unity3d - Unity中如何将两个着色器合并为一个着色器
- python - 有没有办法让一个循环有两个范围?
- c# - 在一个国家/地区生成随机纬度/经度多边形?
- hibernate - 休眠缓存不适用于一对一关系的反面
- python - matplotlib:使用 matplotlib 或 seaborn 显示每个日期的所有产品价格的折线图
- reactjs - 如何在数组中添加对象
- angular - ngbTooltip 和 ngb 分页不起作用