Reviewing the National Economic Council Paper on the Economic Impact of Free Nutritious Meals
It was quite surprising yet interesting when I watched the press conference by the National Economic Council (DEN) some time ago. The reason was that Luhut Binsar Panjaitan (LBP), the DEN chair, gave the spotlight to Professor Arif Anshory Yusuf (AAY) to present a teaser of his ex-ante model results on the impact of the Free Nutritious Meals program (MBG) on the economy. According to AAY, MBG has the potential to create 1.9 million jobs and reduce poverty by up to 5.8%. MBG, he said, is equivalent to giving IDR 600,000 per family if the average number of children in poor families is 3. This figure is 3x larger than PKH! He also added that to realize the maximum impact of MBG, “leakage” of food demand “that does not need to be imported” should be minimized by prioritizing domestic products. Those numbers sound off.
Then on the evening of March 23, 2025 Jakarta time, I watched Professor Arief Anshory Yusuf (AAY) present his latest paper written for the National Economic Council (DEN). The event was organized by Doctrine UK, an Indonesian student association in the United Kingdom. There, he presented a paper on the macroeconomic impact analysis of the Free Nutritious Meals program (MBG). The paper itself was shared in the event chat. The recording has been uploaded to YouTube and can be viewed here.
After reviewing both the paper and the presentation, I felt compelled to write some notes about it. The main purpose is actually for myself, since this model is quite fun to explore and replicate. Additionally, at the event, AAY also represented DEN, which means the policies emerging from this paper can be considered as coming from the government and will likely become public policy. I’m also writing this for friends who aren’t very familiar with CGE1 but want to learn. Lastly, it would be great if this post were read by AAY and DEN, but I’m sure someone of his caliber already receives plenty of input from people far more capable than me, so it’s fine if this goal isn’t achieved. Mostly, this post is for learning and sharing.
I greatly respect him as an academic because AAY is one of the few Indonesian economists who is very vocal about economic issues in Indonesia, especially on Higher Education and pro-poor and pro-job programs. He does not hesitate to criticize the government. Even his paper, which serves as the ex-ante justification for MBG, was shared with everyone, and he regularly presents and seeks opinions from many people across various circles. This level of transparency is something I haven’t found in other government policies.
Having said that, I have some notes that I believe are very important and worth writing about on this blog. I will focus on 2 caveats that he mentioned in his presentation. For other parts, that can be an opportunity for other friends who want to contribute comments. For example, Riandy Laksono’s commentary is also very interesting in my opinion, and easier to read than this post haha.
I will start by briefly summarizing the points I agree with, then move on to things I’m less sure about or disagree with.
Key points in my view
In his paper, AAY summarizes various studies about programs similar to MBG in other countries. In other countries, according to him, MBG has been quite successful. He also says that MBG is a very progressive program. I think it’s hard to disagree that MBG, as a concept, is a progressive program.
The paper also explains some details about MBG that are consistent with explanations from other sources (e.g., CISDI). He mentions a budget of 171 trillion rupiah, one of the largest welfare programs in the world, targeting approximately 82.9 million people.
Equally important: AAY mentions several official objectives of MBG: better nutrition, job creation, supporting local food systems, and improving student attendance and health. Nevertheless, he says that MBG should not be designed to pursue too many objectives at once, and I agree.
Finally, AAY uses input-output (IO) analysis and microsimulation to show the economic impacts in terms of increased output, value added, and employment, as well as poverty reduction from this program. Various simulations with different scenarios were conducted, but the results are consistently positive overall.
Important caveats
However, in his presentation, AAY stated two caveats that are very heroic and automatically dismiss much of the discussion about MBG:
- This model is an ex-ante scenario assuming ideal implementation. All criticisms regarding operational aspects cannot be answered with this paper.
- There is no general equilibrium aspect (supply, demand, market, and optimization, at least), so things like price changes and international trade are not reflected in this model.
In my personal opinion, these two things are arguably the most influential factors that could potentially derail this program. At the Doctrine UK event the other day, perhaps the majority of questions and discussions from participants were precisely about best practices and institutional readiness. I add some additional thoughts here beyond what was already raised by friends at the event, which can be read directly at the end of this post.
But this post will hyperfocus on point 2, something more relevant to AAY’s paper. I was quite surprised to hear AAY argue that IO analysis Computable General Equilibrium (CGE), and that IO does not account for price changes. In my opinion, that statement is not technically correct. I will also provide 3 arguments for why the results from the IO scenario may not be suitable for making claims as confident as what AAY showed at the DEN press conference above.
I will nerd out a bit about CGE to address caveat no. 2. This section will be too geeky. Read at your own risk. You’ve been warned.
The General Equilibrium Aspect
What is Input-Output Analysis (IO)?
In his paper, AAY explains IO in section 3.1.1., which is on page 4 of the paper.
There are 3 important terms AAY uses when explaining IO analysis: output, value added, and employment. Output is essentially the total production of an industry. Value added is total production minus inputs/raw materials. So value added consists of factors of production, mainly labor and capital. And labor equals employment.
The IO structure in AAY’s paper is exactly the same as a typical IO model, which is more or less like this:
where the resulting vector x represents input demand for sector . That is, input demand from vector depends on the shift-share of each industry in for each industry in , and final demand .
In an Input-Output table, we can show output and value added if you open an actual IO table from BPS.
| wew | s1 | s2 … sj | y | sum |
|---|---|---|---|---|
| s1 | ||||
| s2 | ||||
| si | ||||
| va | - | GDP | ||
| sum | GDP | - |
Here, can be formed into a matrix equivalent to by setting . Hopefully that’s clear.
Usually, matrix is set through some optimization (you know, lagrange and stuff). Well, typically, matrix A in IO analysis is exogenous. In other words, the elements of matrix A are fixed and only expand along with output . Therefore, all exogenous changes in the economy (in this case in ) are assumed to only expand according to matrix A.
Actually, IO is also CGE. It’s just that IO is a special case of CGE, where the output demand function has a perfect complement property. Perfect complement is a very useful assumption because the optimization becomes linear. Computationally, it becomes much easier since we only need linear algebra without any nonlinear optimization.
Additionally, Leontief is convenient because the optimization only expands according to the optimal share of each component.
For example, an input function will have an optimal point at so the demand function for will be and will be constant and fixed throughout changes in the consumption composite.
This method is relatively straightforward to implement in Python, as long as the IO matrix is available. I tried to replicate using a lite version of the IO table, which is aggregated to 17 sectors. Of all the scenarios, I will try to replicate scenario A1 in the paper. From the 17-sector IO table, the lite version, I converted it into matrix A, x and y, and the data for the matrices and vectors can be downloaded here. Note that the y matrix there still contains import values. That’s why in my simulation I construct y myself, not using y from there, so the imports are removed. Actually, you can also subtract the imports from final demand in the Excel file yourself.
import numpy as np
A=np.loadtxt('A.csv',delimiter=',') # matrix A
#y=np.loadtxt('y.csv',delimiter=',') ini final demand yang ada final importnya
u=np.loadtxt('x.csv',delimiter=',') # output
y=u-np.dot(A,u) # final demand tanpa final import
ia=np.identity(17)-A
invA=np.linalg.inv(ia)
np.savetxt('invA.csv', invA,delimiter=",") # save the change matrix result to a new file
x=np.dot(invA,y) ## Make sure replikasi final output di tabel.
x-u
array([ 0.00000000e+00, 4.76837158e-07, 9.53674316e-07, 1.19209290e-07,
-1.49011612e-08, -4.76837158e-07, 4.76837158e-07, 0.00000000e+00,
2.38418579e-07, 0.00000000e+00, 0.00000000e+00, -1.19209290e-07,
0.00000000e+00, -1.19209290e-07, 1.19209290e-07, -1.19209290e-07,
-1.19209290e-07])
## Simulasi MBG A1 di paper AAY
yy=y+np.array([0,0,0,0,0,0,0,0,171e6,0,0,0,0,-171e6,0,0,0]) ## + MBG shock - budget shock
xx=np.dot(invA,yy)
print(f'perubahan %output sektoral setelah +MBG-penghematan:\n {(xx-x)/x*100}') ## Percent change of sectoral output
perubahan %output sektoral setelah +MBG-penghematan:
[ 1.08864224 0.03824485 0.57615184 -0.79322713 -0.71996072
-0.27533884 0.34350708 -0.80514386 13.29429074 -1.13615204
0.0553673 -0.13483742 -1.60608706 -22.73385632 -0.14187647
-0.18583608 -0.23295487]
print(f'pertumbuhan output nasional adalah {(np.sum(xx)-np.sum(x))/np.sum(x)*100} persen') ## Percent change of total output
pertumbuhan output nasional adalah 0.046445748306372714 persen
## Put everything into a dataframe
import pandas as pd
sec=["Pertanian, Kehutanan, dan Perikanan", "Pertambangan dan Penggalian", "Industri Pengolahan", "Pengadaan Listrik dan Gas", "Pengadaan Air, Pengelolaan Sampah, Limbah dan Daur Ulang", "Konstruksi", "Perdagangan Besar dan Eceran; Reparasi Mobil dan Sepeda Motor", "Transportasi dan Pergudangan", "Penyediaan Akomodasi dan Makan Minum", "Informasi dan Komunikasi", "Jasa Keuangan dan Asuransi", "Real Estate", "Jasa Perusahaan", "Administrasi Pemerintahan, Pertahanan dan Jaminan Sosial Wajib", "Jasa Pendidikan", "Jasa Kesehatan dan Kegiatan Sosial", "Jasa lainnya"]
delta=(xx-x)/x*100
## Create pandas of the result
df=pd.DataFrame({'sektor':sec,'delta':delta})
#concat the national results
df2=pd.DataFrame({'sektor':'Total','delta':(np.sum(xx)-np.sum(x))/np.sum(x)*100},index=[17])
df=pd.concat([df,df2])
df
| sektor | delta | |
|---|---|---|
| 0 | Pertanian, Kehutanan, dan Perikanan | 1.088642 |
| 1 | Pertambangan dan Penggalian | 0.038245 |
| 2 | Industri Pengolahan | 0.576152 |
| 3 | Pengadaan Listrik dan Gas | -0.793227 |
| 4 | Pengadaan Air, Pengelolaan Sampah, Limbah dan ... | -0.719961 |
| 5 | Konstruksi | -0.275339 |
| 6 | Perdagangan Besar dan Eceran; Reparasi Mobil d... | 0.343507 |
| 7 | Transportasi dan Pergudangan | -0.805144 |
| 8 | Penyediaan Akomodasi dan Makan Minum | 13.294291 |
| 9 | Informasi dan Komunikasi | -1.136152 |
| 10 | Jasa Keuangan dan Asuransi | 0.055367 |
| 11 | Real Estate | -0.134837 |
| 12 | Jasa Perusahaan | -1.606087 |
| 13 | Administrasi Pemerintahan, Pertahanan dan Jami... | -22.733856 |
| 14 | Jasa Pendidikan | -0.141876 |
| 15 | Jasa Kesehatan dan Kegiatan Sosial | -0.185836 |
| 16 | Jasa lainnya | -0.232955 |
| 17 | Total | 0.046446 |
| indicator | original | replica |
|---|---|---|
| National output | 0.06 | 0.046 |
| Agriculture | 1.37 | 1.08 |
| manufacture | 0.12 | 0.57 |
The A1 simulation results: the original is from AAY, the replica is mine. There are differences in the numbers, likely due to different tables and certainly different aggregation levels. But they’re relatively close, so I think it’s fairly accurate haha.
Three limitations of this model are immediately apparent.
First is the limitation of the constant shift-share assumption a la Leontief. This is immediately visible from the source of growth. The balanced budget reallocation produces positive additional output because the food service sector has a larger “total multiplier” (in the paper, terms and , pp.6) than the government services sector. The problem is that this total multiplier is constant regardless of how much is added or subtracted. Without changes in marginal return, if the goal is output growth, we might as well move ALL output from government services to the food service sector (i.e., corner solution). But in the real world this doesn’t happen, because as a sector loses output, marginal productivity there rises, while a sector that is already bloated will experience diminishing returns, eliminating gains as more resources flow into it. Plus, on the demand side, there is also marginal utility that changes as consumption patterns concentrate on a single service. This is not a problem if the shock is relatively small. But given that the MBG shock raises the food service sector by 13.3% and cuts the government service sector by -22.73%, the constant marginal return assumption is likely to be problematic.
Second, the vector is treated as final demand without considering exports and imports. Indeed, the column in the BPS IO table originally contains capital formation and exports, which are aggregated into here. Meanwhile, in the first column there should be an imported raw materials row. In CGE, we often add a substitution function with Armington elasticity between imported and domestic inputs for each sector. Naturally, the absence of international trade (or more precisely, treating the shift-share of international trade as exogenous/constant) makes it difficult to forecast MBG’s impact on exports and imports. That is why AAY said at this event something like MBG will have a good impact as long as there is no “leakage,” that “materials that don’t need to be imported” should not be imported. I think this is not the best way to conclude from the model.
More importantly, in AAY’s paper, I could not find information about which table he used for the analysis. This is important because BPS has 2 types of IO tables: total transactions and domestic transactions. In the domestic table, only domestic input figures appear in the matrix, and all imports are pooled in row 2000. In the total table, the matrix already includes imports, so row 2000 is empty. There is no information in the paper about whether Armington calibration was performed for domestic vs. imported product choices.
If the domestic transaction table was used, then the matrix does not reflect total inputs (tends to be biased), implicitly treating imports as fixed, hence the “don’t leak” conclusion, which may be consistent with what the model says. But if the total transaction table was used, then the matrix already includes imported goods, and it may well be that “leakage” occurs in the model with no negative consequences whatsoever. Or maybe I’m the one misreading it and the procedure for removing imported input is actually explained somewhere in the paper. But it should be made more explicit.
However, the critique about the exogenous trade balance is actually very much related to the third critique: the absence of prices. The absence of prices becomes super relevant when we use a model with optimization and constraints. Without constraints, production in the MBG-recipient sector can seemingly expand as far as . In reality, it is the supply-side constraint that would cause inflation. When there is a (budget) constraint, optimization must be performed, and consequently income effect and substitution effect will emerge (if using assumptions other than Leontief). In particular, this income effect will greatly affect the need for exports/imports, but more importantly, total consumption and poverty calculations.
Let me explain.
Constraint and prices
Under the Leontief assumption, when we shock final demand (in column where the shocked sector), output from the shocked sector increases, and input demand from that sector increases, visible in column where the sector experiencing the change in . Like sort of thing.
For example, if demand in sector increases to so we have a vector shaped like this:
let us call that new vector so that . Then we compute .
The change in input demand from sector is exactly . AAY explains this on page 6 of his paper. Now, that term contains the identity matrix and matrix , which we have made exogenous. This means the change in input demand from that sector depends only on and does not depend on price changes at all.
The BPS 2020 IO table is essentially a transaction matrix. Transactions imply current prices, where there is both quantity and price. Now, a simple IO exercise usually treats those matrix values as quantities. So if an element of the matrix (which is actually a value) moves, the movement is treated as a quantity movement.
The problem is that, with constraints, we can show that input demand usually depends on prices!
Consider typical Leontief production:
Optimization implies , so . Substituting into the constraint:
If we replace income with the price of output 1 times the quantity of output 1, , then demand for output 2 becomes:
and we can generalize the equation above for to:
where is the material input from industry to industry , is the output price of industry , is the output of industry . is a function of the isocost of industry (which equals total revenue) and input prices for each industry including .
In the replication above, is proxied by , where this term only changes because of . Yet, as shown above, prices also matter. If , then simply has relative shift share and final demand , which is exactly what happens in the replication above.
Now, one can argue that price-dependent input demand is not a problem as long as we assume the sector is a price taker. That is, the demanding sector is so small that the market will always provide supply (i.e., there are infinitely many suppliers) without affecting price increases. But this is certainly not always realistic, especially since the sector in question has high demand for agricultural products, a sector that has historically always been plagued by bureaucratic trade governance, miscalculations, perpetually failed self-sufficiency programs, and so on. It seems difficult to expect super elastic supply from this sector.
Of course, we could also model the limitations from the supply composite labor side, where we could model a production nest. Indeed, in the IO table there is actually a separate labor share, which is also assumed to have a constant parameter , just like value added which has a constant parameter . Both assumptions can be relaxed.
But perhaps another time.
Implementation problems
I also intend to add some thoughts on the importance of considering implementation problems that will have a very significant impact on the conclusions about MBG’s impact.
I agree that if ALL schools receive this program, then it could be progressive, assuming the budget sacrificed for MBG comes from a line item that is usually enjoyed by the relatively wealthier segment of society (hence lower marginal propensity to consume2). But there are several implementation possibilities suggesting this may not happen on the ground.
First, regarding the distribution of recipient schools. As I understand it, not all schools receive this program simultaneously. Some schools get MBG (treatment) and others do not (control). The problem arises if treatment does not occur randomly/exogenously. For example, if in general the schools that receive it first are those that tend to be more prepared in terms of infrastructure. Such schools are typically located in relatively wealthier areas. If this is the case, although AAY provides some anecdotes about poor community groups as beneficiaries, many participants may actually be in areas that are already fairly well-off.
Second is corruption. If this program is corrupted, the corrupt actors are most likely much wealthier than the beneficiaries. This means MBG would be dangerous if it becomes a vehicle for income transfer from the party whose budget was cut to the party that corrupts MBG. This is certainly not pro-poor. Indications of corruption (or at least failure to meet good nutritional standards) were already raised by participants at the Doctrine UK event the other day.
Lastly, the CGE scenario above may also be less effective if it turns out that not all of the 171T is used for food portions. Some of the money could also be used for operations and institution-building. Someone mentioned that the Ministry of Health already has institutions ready for use, so there’s no need to create new institutions like BGN and communal kitchens. A waste of resources.
Conclusion
In closing, I have tried to offer constructive criticism in this post. I focused on the IO model and tried to show that 3 assumptions in the IO model (constant shift-share, absence of international trade, and fixed nominal prices) could be violated. Of course, no model will be exactly the same as the real world. All models are wrong but that’s fine as long as the model is useful for explaining phenomena. It only becomes a problem when the assumptions that don’t hold have very important consequences for the conclusions drawn as a basis for policy.
I also want to once again express my appreciation for AAY for providing a level of transparency that is quite rare in government circles. It is very rare for anyone to document the studies used by the government as a policy guide, so that civil society like me can participate in the debate. As someone still junior, my input may not be that important, but it’s nice to be able to follow the thinking of Indonesia’s policy architects and learn from it. Hopefully this kind of openness will spread to all government sectors.
I’ll stop here for now. Maybe next time we can try modeling that production nest if I have some spare time. It’s gonna be fun! It’s been a long time since I’ve tinkered with CGE. Alright, see ya next post.