我尝试在 Mata 中使用线性规划。我是马塔新手。
我想根据之前通过有序概率获得的概率为每个人分配一个教育类别(z,s,v = 低,中,高)。我还对人口中的每个类别进行了边际分布。
P* 是我对每个类别的概率,R* 是从最高到最低概率的排名,Q* 是人口中每个教育类别的个体数量。
我想优化这样的东西:
最小化排名的目标函数=选择最可能的受边际分布影响的教育类别:
min Σ (RzXz + RsXs + RvXv)
X 应该是 1 或 0
ΣXz = Qz, ΣXs = Qs, ΣXv = Qv
我收到两条错误消息:
等式约束的维度无效 等式约束系统矩阵必须与右侧具有相同的行。 r(3200);
和
为矩阵 X 指定的变量太少 r(102);
当然 X 是一个空矩阵。
对于 Q* 我知道我应该指定一个标量而不是相同数字的向量,这只是我来自 STATA 的变量,我与分布数据合并,但不确定是否热衷于这样做(本地 marcos 没有解决) .
除此之外,我不知道从哪里开始解决我的问题。我想获得一个由三个变量 X 组成的矩阵,告诉我必须根据边际分布选择哪个类别。
我将感谢任何建议/提示以及要考虑的事项。
clear
input float(Pz Ps Pv Qz Qs Qv) byte(Rz Rs Rv)
.0226813 .8045667 .172752 5956.511 72222.695 5336.041 3 1 2
.09679342 .8531785 .05002809 5956.511 72222.695 5336.041 2 1 3
.06026781 .8577851 .0819471 5956.511 72222.695 5336.041 3 1 2
.15252922 .8199771 .027493654 5956.511 72222.695 5336.041 2 1 3
.24786794 .7403268 .011805267 5956.511 72222.695 5336.041 2 1 3
end
putmata Pz Ps Pv Qz Qs Qv Rz Rs Rv, replace
mata
lp = LinearProgram()
P = (Pz, Ps, Pv) // probabilities
Q = (Qz, Qs, Qv) // marginal distributions
R = ( Rz, Rs, Rv) // ranks
m = cols(R)
n = rows(R)
for (i=1; i<=n; i++) {
// ----------------------------------------------------
// coefficients
X = J(m, n , .)
coefs = (sum(Rz), sum(Rs), sum(Rv))
// equality constraints
eq_lhs = (1 , 1, 1) ; eq_rhs = 1
eq_l = sum(X) ; eq_r = Q
// bounds
lower = (0, 0, 0)
upper = (1, 1, 1)
// ----------------------------------------------------
// set class
lp.setMaxOrMin("min")
lp.setCoefficients(coefs)
lp.setEquality( eq_lhs, eq_rhs)
lp.setEquality( eq_l, eq_r)
lp.setBounds(lower, upper)
// ----------------------------------------------------
// solve linear program
lp.optimize()
lp.parameters()
x[i,.] = lp.parameters() // Store parameter
}
// ----------------------------------------------------
// done
// Return solution as vector (x, value_of_objective_function)
X
st_matrix("coefs", X) // export to STATA
end
getmata X
感谢您的提示。 我修改了我的代码和目标函数:
问题: 我想根据之前通过有序概率获得的概率为每个人分配一个教育类别(z,s,v = 低,中,高)。我还对人口中的每个类别进行了边际分布。
最大化概率的目标函数=选择最可能服从边际分布的教育类别: 最大 Σ (PzXz + PsXs + PvXv)
X 应该是 1 或 0
ΣXz = Qz, ΣXs = Qs, ΣXv = Qv
我的代码现在是:
* Example generated by -dataex-. For more info, type help dataex
clear
input float(Pz Ps Pv Qz Qs Qv)
.0226813 .8045667 .172752 3 5 2
.09679342 .8531785 .05002809 3 5 2
.06026781 .8577851 .0819471 3 5 2
.15252922 .8199771 .027493654 3 5 2
.24786794 .7403268 .011805267 3 5 2
.0226813 .8045667 .172752 3 5 2
.09538278 .8537293 .0508879 3 5 2
.05995392 .8576999 .08234616 3 5 2
.08492604 .8570921 .05798185 3 5 2
.09858042 .8524512 .04896835 3 5 2
end
putmata Pz Ps Pv Qz Qs Qv, replace
mata
lp = LinearProgram()
P = (Pz, Ps, Pv) // probabilities
Q = (Qz, Qs, Qv) // marginal distributions
m = cols(P)
n = rows(P)
X = J(m, n , .)
eq_l = sum(X) ; eq_r = Q
// has to be out of the loop
// bounds
for (i=1; i<=n; i++) {
// ----------------------------------------------------
// coefficients
coefs = (Pz, Ps, Pv)
// equality constraints
eq_lhs = (1 , 1, 1) ; eq_rhs = 1
lower = (0, 0, 0)
upper = (1, 1, 1)
// ----------------------------------------------------
// set class
lp.setMaxOrMin("max")
lp.setCoefficients(coefs)
lp.setEquality( eq_lhs, eq_rhs)
lp.setEquality( eq_l, eq_r)
lp.setBounds(lower, upper)
// ----------------------------------------------------
// solve linear program
lp.optimize()
lp.parameters()
X[i,.] = lp.parameters() // Store parameter
}
// ----------------------------------------------------
// done
// Return solution as vector (x, value_of_objective_function)
X
st_matrix("coefs", X) // export to STATA
end
//getmata X
我现在收到一条错误消息: 系数的维数无效 系数必须是长度至少为 1 的行向量。
我仍然认为我应该将 Q* 存储为标量而不是前一个变量的向量,但不知道该怎么做。还努力确定这种方式是否真的达到了我的目的。
错误出现在这一行之后
X[i,.] = lp.parameters() // Store parameter