使用面板数据在 Mata 中进行线性规划 - 循环个体,指定目标函数

问题描述 投票:0回答:1

我尝试在 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
optimization stata linear-programming panel-data
1个回答
0
投票

感谢您的提示。 我修改了我的代码和目标函数:

  • 将 X 的总和从循环中取出,
  • 用概率替换排名 - 实际上我不需要它们,我可以最大化概率而不是最小化排名
  • 还更改了输入数据,在我的示例中,可以通过 10 个第一个观察值重新达到边际分布

问题: 我想根据之前通过有序概率获得的概率为每个人分配一个教育类别(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
© www.soinside.com 2019 - 2024. All rights reserved.