This document tracks the budget of the Department of Agriculture (DA) across ten fiscal years, FY 2018 to FY 2027, following each peso from the Executive’s proposal (NEP) to enactment (GAA), release (allotment), commitment (obligation), and final cash payment (disbursement). It covers the Office of the Secretary (OSEC) in depth and the nine attached agencies in a dedicated section, and it is written for civil-society organizations and advocates scrutinizing the newly released FY 2027 proposal — ending with full, sortable line-item tables they can interrogate directly.
The headline for FY 2027: the Executive proposes to cut DA to ₱171.3B department-wide (₱152.0B for the OSEC) — down about ₱14B, roughly 8%, from the FY 2026 enacted level — even as food security and farm-input costs dominate public debate. But the aggregate hides two moves advocates should focus on. Farm-to-Market Roads are nearly halved (₱33B → ₱16B), the single largest change; and the Locally-Funded and Foreign-Assisted project portfolio grows to over half the OSEC budget (₱76.9B, 50.6%) — even though it is the category the department has historically absorbed most slowly, disbursing only about a third to a half of what it is given. (This portfolio is an aggregation of many small, often short-lived projects — individually itemized in the budget documents, but collapsed here into one line for clarity.)
This report opens up that core. In addition to the standard analysis it adds three deep-dives the slide format could not carry: the operational core by service type (Production Support, Extension, Market Development, R&D, Equipment, Irrigation); the operational core by commodity (rice, corn, livestock, high-value crops, and more); and the two aggregated mega-lines (Farm-to-Market Roads and the Locally-Funded/Foreign-Assisted portfolio), where most of the money — and most of the delivery risk — now sits.
The FY 2027 NEP proposes to cut the DA budget to ₱171.3B department-wide (₱152.0B for the OSEC) — down about ₱14B, roughly 8%, from the FY 2026 enacted level — even as food security and farm-input costs dominate public debate.
Farm-to-Market Roads are nearly halved. The FMR line falls ₱33B → ₱16B (−₱17B), by far the single largest change in the proposal. (FMR is appropriated at DA but implemented by DPWH, and shows zero DA execution every year.)
Locally-funded and foreign-assisted projects grow to over half the OSEC. Grouped together they rise +₱5.3B to ₱76.9B — 50.6% of the entire OSEC budget. This is an aggregation of many individual projects — often small and short-lived (appearing one year, absent the next), and itemized in the budget documents but collapsed here into one line — and, as a group, it absorbs slowly: disbursement-to-allotment was just 33% (2024) and 53% (2025).
That is the central risk. The fastest-growing, largest category is also the one the department has historically absorbed most slowly — so the FY 2027 proposal tilts DA further toward money it has struggled to spend.
The operational core is roughly held or trimmed. The National Rice Program’s Production Support stays around ₱26B; livestock and corn production support are cut. Several extension, equipment and modernization lines see modest increases.
Most attached agencies are also cut. The Philippine Carabao Center, National Meat Inspection Service, Agricultural Credit Policy Council and others fall, with the Bureau of Fisheries and Aquatic Resources the main exception (it grows). Attached agencies remain about 11% of the department (₱19.3B proposed for 2027) — and have no P/A/P-level execution data, so for them this review is NEP/GAA only.
Absorption has weakened as the budget grew. Aggregate OSEC disbursement-to-allotment ran 74–81% from 2018 to 2023, then fell to 70% (2024) and 69% (2025) — the backdrop against which the proposal loads still more onto the slow-disbursing foreign-assisted portfolio.
The scrutiny question for advocates: does a smaller DA budget — tilted further toward a fast-churning, slow-disbursing foreign-assisted portfolio and away from farm-to-market roads — match the government’s stated food-security priorities?
Period. FY 2018 through FY 2027. FY 2027 is the NEP — the Executive’s proposal — only: not yet debated or enacted, with no execution data. FY 2026 reflects NEP/GAA only. Execution data (Adjusted Allotments, Obligations, Disbursements) is available for the Office of the Secretary for 2018–2025, so the most recent per-P/A/P utilization shown is FY 2025. Attached-agency execution data is not available at all, so those sections are NEP/GAA only — the FY 2027 proposal is exactly the lever advocates can act on before enactment.
Reading the proposal. Wherever a chart or table shows FY 2027, the figure is proposed. For the OSEC lines, the FY 2025 utilization columns sit alongside the 2027 proposal so a reader can weigh each line’s track record against what it is now being handed; for the attached agencies, no such record exists yet.
Scope. DA Office of the Secretary (68 P/A/Ps) plus nine attached agencies. Current New Appropriations only — this excludes Continuing and Automatic Appropriations and Special Purpose Fund transfers, a point that matters for the FMR discussion below. Nominal pesos.
Expense classes. Personnel Services (PS), Maintenance & Other Operating Expenses (MOOE), Financial Expenses (FE, negligible at DA), and Capital Outlays (CO).
PREXC structure (OSEC). General Administration (1000), Support to Operations (2000), Production and Marketing Support (3101 — the operational core), Infrastructure Support (3102), Policy Formulation (3103), Regulatory Services (3104), and a Locally-Funded and Foreign-Assisted bucket (3105).
The service and commodity decomposition. DA’s operational P/A/Ps are labelled in a regular “{service} on the {commodity} Program” form — e.g. Production Support Services (PSS) on the National Rice Program. This report parses that structure to aggregate the operational core two ways: by service type (PSS, ESETS, MDS, R&D, PAEF, INS) and by commodity (rice, corn, livestock, high-value crops, organic, halal, urban/peri-urban). These cuts cover the commodity operational core (~₱47.6B in 2026); they deliberately exclude FMR, LFP/FAP, administration, and regulatory lines, which are not commodity-tagged.
Two lines are aggregates of many. In the source budget documents, both Farm-to-Market Roads and the Locally-Funded and Foreign-Assisted Program are itemized into hundreds of individual sub-projects. Presenting those individually would bury the analysis in small amounts, so each is treated here as a single aggregate line — which is also how they appear in this dataset.
Absorptive-capacity denominator. Unless noted, ratios use Adjusted Allotments — how well DA spent what was actually placed in its hands, separate from how much of its GAA was transferred out or never released.
evo <- osec_totals %>% filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Obligations","Disbursements"),
labels = c("NEP (proposed)","GAA (enacted)","Adj. Allotment","Obligations","Disbursements")))
ggplot(evo, aes(year, total, color = metric, group = metric)) +
geom_line(linewidth = 1.0) + geom_point(size = 2) +
scale_color_manual(values = exec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = c(seq(2018, 2026, 2), 2027)) +
labs(title = "DA-OSEC budget, NEP through Disbursements (FY 2018–2027)",
subtitle = "After years of growth, the FY 2027 NEP proposes a step down to ₱152B; execution had already lagged allotments since 2023",
x = NULL, y = NULL, caption = "FY 2026 = NEP/GAA only; FY 2027 = NEP (proposed) only. Execution data ends at FY 2025.") +
theme_da() + guides(color = guide_legend(nrow = 1))
The long-run growth is dramatic, but two features matter more for the FY 2027 debate. First, the widening gap between the allotment line and the disbursement line after 2023 — money arriving faster than it goes out the door. Second, the rightmost point: the FY 2027 NEP steps the budget down from the 2026 enacted peak, even as it leans harder on the slow-disbursing project portfolio (below).
tbl_evo <- osec_totals %>% filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
mutate(value = total/1e9) %>% select(year, metric, value) %>%
pivot_wider(names_from = year, values_from = value) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Obligations","Disbursements"),
labels = c("NEP","GAA","Adj. Allotment","Obligations","Disbursements"))) %>%
arrange(metric) %>% rename(`PHP B` = metric)
kbl_clean(tbl_evo, font = 13, digits = 1, format.args = list(big.mark = ","), na = "")
| PHP B | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 |
|---|---|---|---|---|---|---|---|---|---|---|
| NEP | 43.0 | 36.3 | 43.7 | 54.6 | 59.8 | 88.1 | 92.4 | 111.5 | 134.9 | 152 |
| GAA | 43.9 | 36.7 | 51.0 | 58.7 | 58.8 | 85.9 | 96.0 | 107.7 | 165.5 | |
| Adj. Allotment | 30.6 | 22.8 | 21.8 | 35.9 | 37.3 | 59.1 | 65.4 | 59.1 | ||
| Obligations | 29.5 | 22.0 | 21.0 | 34.5 | 35.7 | 53.2 | 58.6 | 51.8 | ||
| Disbursements | 22.7 | 17.6 | 17.8 | 28.6 | 30.2 | 45.3 | 45.8 | 40.9 |
wide_yr <- osec_totals %>% pivot_wider(names_from = metric, values_from = total)
growth <- wide_yr %>% arrange(year) %>%
transmute(year, `GAA (B)` = round(GAA/1e9,1), `Growth %` = scales::percent(GAA/lag(GAA) - 1, accuracy = 0.1),
`NEP (B)` = round(NEP/1e9,1), `Net adj. GAA−NEP (B)` = round((GAA-NEP)/1e9,1))
kbl_clean(growth, font = 13, align = "rrrrr", na = "")
| year | GAA (B) | Growth % | NEP (B) | Net adj. GAA−NEP (B) |
|---|---|---|---|---|
| 2018 | 43.9 | 43.0 | 0.9 | |
| 2019 | 36.7 | -16.4% | 36.3 | 0.4 |
| 2020 | 51.0 | 38.8% | 43.7 | 7.3 |
| 2021 | 58.7 | 15.1% | 54.6 | 4.0 |
| 2022 | 58.8 | 0.2% | 59.8 | -1.0 |
| 2023 | 85.9 | 46.1% | 88.1 | -2.2 |
| 2024 | 96.0 | 11.8% | 92.4 | 3.6 |
| 2025 | 107.7 | 12.1% | 111.5 | -3.8 |
| 2026 | 165.5 | 53.7% | 134.9 | 30.6 |
| 2027 | 152.0 |
Congress stayed within about ₱5B of the Executive’s proposal in most years — sometimes trimming (2022, 2023, 2025), sometimes adding. The exception is the proposed FY 2026 +₱31B Congressional add, concentrated in the two mega-lines.
comp <- osec_long %>% filter(metric == "GAA", year <= 2026, !is.na(amount)) %>%
group_by(year, category) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(category = factor(category, levels = names(cat_pal)))
ggplot(comp, aes(year, amount, fill = category)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = cat_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "Composition of the GAA by PREXC program, 2018–2026",
subtitle = "Locally-Funded/Foreign-Assisted explodes in 2025–2026; Production & Marketing is the operational backbone",
x = NULL, y = NULL) +
theme_da() + guides(fill = guide_legend(nrow = 3, byrow = TRUE))
The grey Locally-Funded and Foreign-Assisted band is modest until 2024, then explodes to dominate the 2026 budget. The green Production and Marketing Support program — the hands-on commodity work decomposed later in this report — grows steadily but is increasingly outweighed by the LFP/FAP and infrastructure (FMR) blocks.
comp_pct <- comp %>% group_by(year) %>% mutate(share = round(amount/sum(amount)*100,1)) %>% ungroup() %>%
select(category, year, share) %>% pivot_wider(names_from = year, values_from = share)
kbl_clean(comp_pct %>% rename(`Program (% of GAA)` = category), font = 12, digits = 1, na = "")
| Program (% of GAA) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| General Administration and Support | 3.7 | 3.5 | 2.4 | 2.3 | 2.4 | 2.2 | 2.1 | 1.8 | 1.5 |
| Infrastructure Support | 38.7 | 38.7 | 26.1 | 26.2 | 25.4 | 30.1 | 31.0 | 28.2 | 22.7 |
| Locally-Funded and Foreign-Assisted | 10.2 | 13.4 | 39.4 | 27.9 | 29.1 | 16.6 | 19.8 | 32.5 | 43.3 |
| Policy Formulation | 0.2 | 0.2 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.0 |
| Production and Marketing Support | 37.8 | 29.8 | 21.1 | 34.2 | 33.4 | 41.1 | 39.3 | 30.5 | 26.2 |
| Regulatory Services | 2.2 | 2.5 | 2.3 | 2.1 | 2.1 | 4.4 | 1.9 | 1.2 | 1.0 |
| Support to Operations | 7.2 | 11.9 | 8.5 | 7.1 | 7.5 | 5.6 | 5.8 | 5.8 | 5.3 |
ec_levels <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)","Financial Expenses (FE)","Capital Outlays (CO)")
comp_ec <- df_long_all %>% filter(agency == "Office of the Secretary", metric == "GAA", year <= 2026,
expense_class %in% c("1PS","2MOOE","3FE","6CO")) %>%
group_by(year, expense_class) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(expense_class = factor(expense_class, levels = c("1PS","2MOOE","3FE","6CO"), labels = ec_levels))
ggplot(comp_ec, aes(year, amount, fill = expense_class)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = ec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "GAA composition by Expense Class, 2018–2026",
subtitle = "Capital Outlays are 37–49% of the budget — unusually high, and concentrated in FMR",
x = NULL, y = NULL) +
theme_da() + guides(fill = guide_legend(nrow = 1))
DA is, unusually, a capital-heavy department: Capital Outlay runs 37–49% of the GAA every year, with Personnel Services a sliver (3–9%) and MOOE the rest. But the CO figure is misleading taken at face value: a large share of it is the FMR line, which is 100% Capital Outlay and records zero execution. The table separates the two views.
co_tbl <- df_long_all %>% filter(agency == "Office of the Secretary", metric == "GAA",
expense_class %in% c("1PS","2MOOE","3FE","6CO")) %>%
mutate(isFMR = pap == FMR_LABEL) %>% group_by(year) %>%
summarise(total = sum(amount, na.rm = TRUE),
co_all = sum(amount[expense_class == "6CO"], na.rm = TRUE),
co_exfmr = sum(amount[expense_class == "6CO" & !isFMR], na.rm = TRUE), .groups = "drop") %>%
transmute(Year = year,
`CO incl. FMR` = scales::percent(co_all/total, accuracy = 1),
`CO excl. FMR` = scales::percent(co_exfmr/total, accuracy = 1))
kbl_clean(co_tbl, font = 13, align = "rrr")
| Year | CO incl. FMR | CO excl. FMR |
|---|---|---|
| 2018 | 49% | 26% |
| 2019 | 48% | 21% |
| 2020 | 46% | 26% |
| 2021 | 40% | 20% |
| 2022 | 38% | 25% |
| 2023 | 37% | 21% |
| 2024 | 41% | 20% |
| 2025 | 48% | 27% |
| 2026 | 41% | 21% |
| 2027 |
Excluding FMR, the genuine capital share is a more moderate 25–34% — still high, reflecting the equipment (PAEF) and irrigation (INS) programs and the capital half of LFP/FAP.
top10 <- osec_pap_year %>% filter(year == 2026, !is.na(GAA), GAA > 0) %>%
arrange(desc(GAA)) %>% slice_head(n = 10) %>% mutate(pap = factor(pap, levels = rev(pap)))
ggplot(top10, aes(pap, GAA)) +
geom_col(fill = bar_fill, width = 0.75) +
geom_text(aes(label = php_b(GAA)), hjust = -0.1, size = 3.3, color = "grey20") +
coord_flip() +
scale_x_discrete(labels = function(x) str_wrap(x, 48)) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, .20)), limits = c(0, NA)) +
labs(title = "Top 10 P/A/Ps by FY 2026 GAA",
subtitle = "LFP/FAP is PHP 72B — 43% of the OSEC budget on its own; FMR and Rice PSS follow",
x = NULL, y = NULL) +
theme_da() +
theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
This is the table built for scrutiny. It lists every P/A/P in the Office of the Secretary — not just the top lines — with the proposed and enacted amounts for FY 2025, 2026, and the new FY 2027 proposal side by side, and each line’s most recent actual spending record (FY 2025 utilization): what it was allotted, obligated, and disbursed, plus the disbursement rate (D/A). Sort by NEP 2027 to see the proposal’s priorities; sort by D/A 2025 to see which lines actually spend what they are given. Sortable, searchable, CSV-exportable; amounts in PHP billions (the FY 2027 GAA is blank — not yet enacted).
mk <- function(y, m) osec_pap_year %>% filter(year == y) %>% transmute(pap, !!m := .data[[m]]/1e9)
osec_master <- mk(2025,"NEP") %>% rename(`NEP 2025 (B)`=NEP) %>%
left_join(mk(2025,"GAA") %>% rename(`GAA 2025 (B)`=GAA), by="pap") %>%
left_join(mk(2026,"NEP") %>% rename(`NEP 2026 (B)`=NEP), by="pap") %>%
left_join(mk(2026,"GAA") %>% rename(`GAA 2026 (B)`=GAA), by="pap") %>%
left_join(mk(2027,"NEP") %>% rename(`NEP 2027 (B)`=NEP), by="pap") %>%
left_join(osec_pap_year %>% filter(year==2025) %>%
transmute(pap, `Allot 2025 (B)`=AdjAllot/1e9, `Oblig 2025 (B)`=Obligations/1e9,
`Disb 2025 (B)`=Disbursements/1e9,
`D/A 2025`=ifelse(!is.na(AdjAllot)&AdjAllot>0, Disbursements/AdjAllot, NA_real_)), by="pap") %>%
mutate(`Proposed chg 26→27 (B)` = `NEP 2027 (B)` - `GAA 2026 (B)`) %>%
rename(`P/A/P`=pap) %>%
select(`P/A/P`,`NEP 2025 (B)`,`GAA 2025 (B)`,`NEP 2026 (B)`,`GAA 2026 (B)`,`NEP 2027 (B)`,
`Proposed chg 26→27 (B)`,`Allot 2025 (B)`,`Oblig 2025 (B)`,`Disb 2025 (B)`,`D/A 2025`) %>%
arrange(desc(`NEP 2027 (B)`))
dt_table(osec_master, page = 20,
money_cols = c("NEP 2025 (B)","GAA 2025 (B)","NEP 2026 (B)","GAA 2026 (B)","NEP 2027 (B)",
"Proposed chg 26→27 (B)","Allot 2025 (B)","Oblig 2025 (B)","Disb 2025 (B)"),
pct_cols = "D/A 2025")
Blank cells mean no appropriation or no execution record in that year. A line with a large FY 2027 proposal but a low D/A 2025 is where the gap between ambition and delivery is widest — the Locally-Funded/Foreign-Assisted and equipment lines are the ones to watch.
The FY 2027 NEP is the live document advocates can still shape. Department-wide it proposes ₱171.3B — a ₱14B (8%) cut from the 2026 enacted level — but the OSEC reallocation within that smaller envelope is the real story.
o26 <- osec_pap_year %>% filter(year == 2026) %>% transmute(pap, g26 = GAA)
o27 <- osec_pap_year %>% filter(year == 2027) %>% transmute(pap, n27 = NEP)
chg <- full_join(o26, o27, by = "pap") %>%
mutate(g26 = coalesce(g26, 0), n27 = coalesce(n27, 0), delta = (n27 - g26)/1e9) %>%
filter(abs(delta) >= 0.5) %>% arrange(delta) %>%
mutate(pap = factor(pap, levels = pap),
dir = ifelse(delta >= 0, "Proposed increase", "Proposed cut"))
ggplot(chg, aes(delta, pap, fill = dir)) +
geom_col(width = 0.72) +
geom_text(aes(label = sprintf("%+.1f", delta), hjust = ifelse(delta >= 0, -0.15, 1.15)), size = 3, color = "grey20") +
scale_fill_manual(values = c("Proposed increase" = "#1B9E77", "Proposed cut" = "#D95F02")) +
scale_x_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.16, 0.16))) +
scale_y_discrete(labels = function(x) str_wrap(str_trunc(x, 48), 40)) +
labs(title = "Largest proposed OSEC changes, FY 2026 enacted → FY 2027 proposed",
subtitle = "Farm-to-Market Roads are nearly halved (−₱17B); the Locally-Funded/Foreign-Assisted portfolio grows further",
x = NULL, y = NULL) +
theme_da() + theme(panel.grid.major.y = element_blank(),
panel.grid.major.x = element_line(color = "grey85")) +
guides(fill = guide_legend(nrow = 1))
The reallocation has a clear shape. Farm-to-Market Roads are nearly halved (₱33B → ₱16B, −₱17B) — by far the single largest change, and a line DA does not execute itself in any case. The money does not stay within the smaller total: the Locally-Funded and Foreign-Assisted portfolio grows by roughly ₱5B to ₱76.9B — over half the entire OSEC budget — while the operational commodity core is largely held (National Rice Program production support stays around ₱26B) or trimmed (livestock, corn).
Here is what advocates should press hardest. The Locally-Funded/Foreign-Assisted portfolio is now the biggest thing in the department and the thing DA spends least well.
fa_hist <- tibble(
year = c(2022, 2023, 2024, 2025),
da = c(0.68, 0.70, 0.33, 0.53)) # FA-group disbursement-to-allotment (verified from OSEC execution)
ggplot(fa_hist, aes(factor(year), da)) +
geom_col(fill = "#D95F02", width = 0.6) +
geom_text(aes(label = scales::percent(da, accuracy = 1)), vjust = -0.5, size = 3.4, color = "grey20") +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 0.85), expand = expansion(mult = c(0, 0.08))) +
labs(title = "Foreign-assisted portfolio: disbursement-to-allotment by year",
subtitle = "Just 33% (2024) and 53% (2025) disbursed — yet this is the line the FY 2027 proposal grows",
x = NULL, y = NULL) +
theme_da()
The pattern is the core of the scrutiny case: the FY 2027 proposal shifts money out of a line DA doesn’t execute (FMR) and into one it disburses at barely a third to a half (foreign-assisted projects), while holding the hands-on commodity programs flat. Two questions follow directly: (1) what will make the foreign-assisted portfolio disburse faster as it grows past half the budget, and (2) is cutting farm-to-market roads by ₱17B consistent with the government’s stated food-security and rural-connectivity goals? The master table above lets advocates trace both questions line by line.
Re-cutting the identical operational money by commodity answers a different question: which crops and sectors does DA back?
com_26 <- osec_long %>% filter(metric == "GAA", year == 2026, !is.na(commodity)) %>%
group_by(commodity) %>% summarise(GAA = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(commodity = factor(commodity, levels = rev(COMMODITY_LV)))
ggplot(com_26, aes(commodity, GAA)) +
geom_col(aes(fill = as.character(commodity)), width = 0.72) +
geom_text(aes(label = php_b(GAA)), hjust = -0.1, size = 3.4, color = "grey20") +
coord_flip() + scale_fill_manual(values = commodity_pal, guide = "none") +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, .18)), limits = c(0, NA)) +
labs(title = "Operational core by commodity, FY 2026 GAA",
subtitle = "Rice is ~63% of the commodity operational core — more than all other commodities combined",
x = NULL, y = NULL) +
theme_da() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
Rice (₱30.2B) is larger than every other commodity put together. Corn (₱6.7B) and livestock (₱3.8B) are distant seconds; high-value crops (₱2.6B), organic agriculture (₱1.0B), and the small urban/peri-urban and halal programs trail. Philippine agricultural budgeting is, operationally, rice budgeting with everything else at the margin.
com_evo <- osec_long %>% filter(metric == "GAA", year <= 2026, !is.na(commodity)) %>%
group_by(year, commodity) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(commodity = factor(commodity, levels = COMMODITY_LV))
ggplot(com_evo, aes(year, amount, fill = commodity)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = commodity_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "Operational core by commodity, GAA 2018–2026",
subtitle = "Rice's dominance widened with the 2023 PSS surge",
x = NULL, y = NULL) +
theme_da() + guides(fill = guide_legend(nrow = 1))
Rice was always the largest commodity, but its lead widened with the 2023 input-support surge. The relative position of corn, livestock, and high-value crops has been broadly stable.
com_abs <- osec_long %>% filter(year == 2025, !is.na(commodity), metric %in% c("AdjAllot","Obligations","Disbursements")) %>%
group_by(commodity, metric) %>% summarise(a = sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = metric, values_from = a) %>%
transmute(`Commodity` = commodity, `Allotment (B)` = round(AdjAllot/1e9,2),
`Disbursed (B)` = round(Disbursements/1e9,2),
`O/A` = scales::percent(Obligations/AdjAllot, accuracy = 1),
`D/A` = scales::percent(Disbursements/AdjAllot, accuracy = 1)) %>%
arrange(desc(`Allotment (B)`))
kbl_clean(com_abs, font = 13.5, align = "lrrrr")
| Commodity | Allotment (B) | Disbursed (B) | O/A | D/A |
|---|---|---|---|---|
| Rice | 21.13 | 16.59 | 94% | 79% |
| Livestock | 5.34 | 1.76 | 62% | 33% |
| Corn | 5.31 | 4.48 | 98% | 84% |
| High-Value Crops | 2.34 | 1.39 | 89% | 59% |
| Organic | 1.00 | 0.58 | 92% | 58% |
| Urban/Peri-Urban | 0.44 | 0.32 | 91% | 72% |
| Halal | 0.07 | 0.03 | 61% | 37% |
Absorption varies sharply by commodity. Corn is the strongest absorber at 84%, rice a solid 79% — but livestock disbursed only 33% of its 2025 allotment, dragged down by its equipment-heavy mix, and high-value crops and organic sit in the high-50s. The commodities that lean on physical procurement (livestock, with large PAEF lines) absorb worst, echoing the service-level finding.
The cross-tab below holds both dimensions at once — every cell is a 2026 GAA figure (₱B), with row and column totals. It is the operational core in a single view.
mat <- osec_long %>% filter(metric == "GAA", year == 2026, !is.na(service), !is.na(commodity)) %>%
group_by(commodity, service) %>% summarise(v = sum(amount, na.rm = TRUE)/1e9, .groups = "drop") %>%
pivot_wider(names_from = service, values_from = v, values_fill = 0)
# order columns and rows, add totals
svc_present <- intersect(SERVICE_LV, names(mat))
mat <- mat %>% mutate(commodity = factor(commodity, levels = COMMODITY_LV)) %>% arrange(commodity)
mat <- mat %>% select(commodity, all_of(svc_present))
mat$Total <- rowSums(mat[svc_present])
tot_row <- c(list(commodity = "Total"), as.list(round(colSums(mat[c(svc_present,"Total")]), 2)))
mat_disp <- mat %>% mutate(across(all_of(c(svc_present,"Total")), ~round(.,2)))
mat_disp <- bind_rows(mat_disp, as_tibble(tot_row))
kbl_clean(mat_disp %>% rename(`Commodity \\ Service` = commodity), font = 13, align = "lrrrrrr", na = "")
| Commodity Service | PSS | ESETS | PAEF | R&D | MDS | INS | Total |
|---|---|---|---|---|---|---|---|
| Rice | 26.41 | 1.92 | 0.48 | 0.89 | 0 | 0.46 | 30.16 |
| Corn | 4.74 | 0.42 | 1.28 | 0.17 | 0 | 0.10 | 6.71 |
| Livestock | 2.98 | 0.46 | 0.31 | 0.06 | 0 | 0.00 | 3.81 |
| High-Value Crops | 1.02 | 0.52 | 0.87 | 0.08 | 0 | 0.11 | 2.59 |
| Organic | 0.28 | 0.29 | 0.35 | 0.06 | 0 | 0.02 | 1.00 |
| Urban/Peri-Urban | 0.13 | 0.07 | 0.19 | 0.00 | 0 | 0.00 | 0.39 |
| Halal | 0.01 | 0.05 | 0.01 | 0.00 | 0 | 0.00 | 0.07 |
| Total | 35.57 | 3.73 | 3.49 | 1.26 | 0 | 0.69 | 44.75 |
Reading across rows shows a commodity’s service mix; reading down columns shows a service’s commodity mix. The single largest cell — Rice × PSS — is ₱26.4B, larger than every commodity-total except rice itself.
Two single P/A/Ps account for ₱104.6B — 63% — of the 2026 OSEC budget. Both are aggregates of hundreds of itemized sub-projects in the source documents, and both raise execution questions.
fmr <- osec_pap_year %>% filter(pap == FMR_LABEL) %>%
transmute(FY = year, `GAA (B)` = round(GAA/1e9,1),
`Allotment (B)` = round(AdjAllot/1e9,2), `Obligations (B)` = round(Obligations/1e9,2),
`Disbursed (B)` = round(Disbursements/1e9,2))
kbl_clean(fmr, font = 13.5, align = "rrrrr", na = "")
| FY | GAA (B) | Allotment (B) | Obligations (B) | Disbursed (B) |
|---|---|---|---|---|
| 2018 | 10.0 | 0 | 0 | 0 |
| 2019 | 10.2 | 0 | 0 | 0 |
| 2020 | 10.0 | 0 | 0 | 0 |
| 2021 | 11.7 | 0 | 0 | 0 |
| 2022 | 7.5 | 0 | 0 | 0 |
| 2023 | 14.5 | 0 | 0 | 0 |
| 2024 | 19.6 | 0 | 0 | 0 |
| 2025 | 23.2 | 0 | 0 | 0 |
| 2026 | 33.0 | |||
| 2027 |
The FMR construction line carries ₱10–33B of GAA a year, growing steadily — yet its allotment, obligations, and disbursements are recorded as exactly zero in every year, 2018 through 2025. This is the pattern the briefing flagged, and it is worth being precise about what it can and cannot mean.
Two explanations are consistent with zero recorded DA execution:
This dataset cannot distinguish the two: a DPWH transfer and a spill into Continuing Appropriations both leave a zero footprint in DA’s current-year SAAODB. Settling it would require the MOA records or the Continuing-Appropriations execution data, neither of which is in scope here.
Either way, the consequence for this analysis is the same and substantial: roughly ₱33B in 2026 — 20% of the OSEC budget — is appropriated to DA but not executed by DA within the year. It inflates DA’s apparent Capital-Outlay share (the line is 100% CO) while contributing nothing to measured disbursement, and it is a large part of why DA’s GAA-to-allotment ratio looks so low.
lfp <- osec_pap_year %>% filter(pap == LFP_LABEL) %>%
select(year, NEP, GAA, AdjAllot, Disbursements) %>%
pivot_longer(-year, names_to = "metric", values_to = "amount") %>% filter(!is.na(amount)) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Disbursements"),
labels = c("NEP (proposed)","GAA (enacted)","Adj. Allotment","Disbursements")))
ggplot(lfp, aes(year, amount, color = metric, group = metric)) +
geom_line(linewidth = 1.0) + geom_point(size = 2.2) +
scale_color_manual(values = exec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(5), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = c(seq(2018, 2026, 2), 2027)) +
labs(title = "Locally-Funded and Foreign-Assisted Program: 2018–2027 (2027 = proposed)",
subtitle = "An aggregation of many project lines, reaching ₱72B in 2026 — and historically a poor absorber",
x = NULL, y = NULL) +
theme_da() + guides(color = guide_legend(nrow = 1))
osec_pap_year %>% filter(pap == LFP_LABEL, year %in% 2018:2025) %>%
transmute(FY = year, `GAA (B)` = round(GAA/1e9,1), `Allotment (B)` = round(AdjAllot/1e9,1),
`Disbursed (B)` = round(Disbursements/1e9,1),
`D/A` = scales::percent(Disbursements/AdjAllot, accuracy = 1)) %>%
kbl_clean(font = 13.5, align = "rrrrr", na = "")
| FY | GAA (B) | Allotment (B) | Disbursed (B) | D/A |
|---|---|---|---|---|
| 2018 | 4.5 | 1.1 | 0.7 | 61% |
| 2019 | 4.9 | 1.3 | 0.6 | 49% |
| 2020 | 20.1 | 4.1 | 3.5 | 85% |
| 2021 | 16.4 | 5.4 | 3.7 | 68% |
| 2022 | 17.1 | 3.2 | 2.2 | 68% |
| 2023 | 14.2 | 3.2 | 2.2 | 70% |
| 2024 | 19.0 | 9.0 | 2.9 | 33% |
| 2025 | 35.0 | 10.2 | 5.4 | 53% |
Unlike FMR, LFP/FAP does execute — but poorly, and with a large share of its GAA never released as allotment in the first place (in 2025, ₱35B GAA yielded only ₱10.2B of allotment). Of what is released, disbursement-to-allotment averaged ~60% through 2018–2023 and then fell to 33% (2024) and 53% (2025). The 2026 GAA proposes ₱71.6B for this single line — roughly 6× the 2025 GAA — against a recent absorption record near half. This portfolio bundles many distinct loan- and locally-funded projects — each itemized in the budget documents, but aggregated here into one line because they are numerous, individually small, and tend to churn from year to year. The analytical point is not opacity but absorption: unlike FMR, this money stays with DA to spend — and much of it goes unspent.
aug <- osec_pap_year %>% filter(year <= 2026) %>% group_by(pap) %>%
summarise(nep = sum(NEP, na.rm = TRUE), gaa = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
mutate(change = gaa - nep) %>% filter(abs(change) >= 5e8)
aug_plot <- bind_rows(aug %>% arrange(desc(change)) %>% slice_head(n = 8),
aug %>% arrange(change) %>% slice_head(n = 5)) %>% distinct() %>%
mutate(direction = ifelse(change >= 0, "Net increase (GAA > NEP)", "Net decrease (GAA < NEP)"),
hj = ifelse(change >= 0, -0.12, 1.12), pap = factor(pap, levels = pap[order(change)]))
ggplot(aug_plot, aes(pap, change/1e9, fill = direction)) +
geom_col(width = 0.7) +
geom_text(aes(label = sprintf("%+.1fB", change/1e9), hjust = hj), size = 2.9, color = "grey20") +
coord_flip() +
scale_fill_manual(values = c("Net increase (GAA > NEP)" = "#1B9E77", "Net decrease (GAA < NEP)" = "#D95F02")) +
scale_x_discrete(labels = function(x) str_trunc(x, 50)) +
scale_y_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.2, 0.2))) +
labs(title = "Cumulative NEP-to-GAA change by P/A/P, 2018–2026",
subtitle = "Congress shifts money from Rice PSS to FMR and Foreign-Assisted lines",
x = NULL, y = NULL) +
theme_da() +
theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85")) +
guides(fill = guide_legend(nrow = 1))
The redirection is the striking pattern: Congress has added +₱29B to Farm-to-Market Roads (which DA does not execute) and +₱15B to LFP/FAP over the period, while cutting −₱15B from Rice PSS — the agency’s single most operational, best-executing commodity line. A smaller but notable +₱7B went to farm equipment (PAEF). The full list of material movers is below.
aug_full <- osec_pap_year %>% group_by(pap) %>%
summarise(nep = sum(NEP, na.rm = TRUE), gaa = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
mutate(change = gaa - nep) %>% filter(abs(change) >= 5e8) %>%
transmute(`P/A/P` = pap, `Σ NEP (B)` = nep/1e9, `Σ GAA (B)` = gaa/1e9, `Cumulative change (B)` = change/1e9) %>%
arrange(desc(`Cumulative change (B)`))
dt_table(aug_full, page = 10, money_cols = c("Σ NEP (B)","Σ GAA (B)","Cumulative change (B)"))
absorp_long <- osec_absorp %>% select(year, oblig_allot, disb_oblig, disb_allot) %>%
pivot_longer(-year, names_to = "ratio", values_to = "value") %>%
mutate(ratio = factor(ratio, levels = c("oblig_allot","disb_oblig","disb_allot"),
labels = c("Obligations / Adj. Allotment","Disbursements / Obligations","Disbursements / Adj. Allotment")))
ggplot(absorp_long, aes(year, value, color = ratio, group = ratio)) +
geom_line(linewidth = 0.9) + geom_point(size = 2) +
scale_color_manual(values = absorp_pal) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.08), breaks = seq(0, 1, 0.2)) +
scale_x_continuous(breaks = 2018:2025) +
labs(title = "DA-OSEC absorptive capacity, 2018–2025",
subtitle = "Disbursement-to-allotment fell from 74–81% (2018–2023) to 69–70% (2024–2025) — against a rising budget",
x = NULL, y = NULL) +
theme_da() + guides(color = guide_legend(nrow = 1))
osec_absorp %>% transmute(Year = year, `Allotment (B)` = round(AdjAllot/1e9,1),
`Obligations (B)` = round(Obligations/1e9,1), `Disbursements (B)` = round(Disbursements/1e9,1),
`O/A` = scales::percent(oblig_allot, accuracy = 1), `D/O` = scales::percent(disb_oblig, accuracy = 1),
`D/A` = scales::percent(disb_allot, accuracy = 1)) %>%
kbl_clean(font = 13, align = "rrrrrrr")
| Year | Allotment (B) | Obligations (B) | Disbursements (B) | O/A | D/O | D/A |
|---|---|---|---|---|---|---|
| 2018 | 30.6 | 29.5 | 22.7 | 96% | 77% | 74% |
| 2019 | 22.8 | 22.0 | 17.6 | 96% | 80% | 77% |
| 2020 | 21.8 | 21.0 | 17.8 | 96% | 85% | 81% |
| 2021 | 35.9 | 34.5 | 28.6 | 96% | 83% | 80% |
| 2022 | 37.3 | 35.7 | 30.2 | 96% | 85% | 81% |
| 2023 | 59.1 | 53.2 | 45.3 | 90% | 85% | 77% |
| 2024 | 65.4 | 58.6 | 45.8 | 90% | 78% | 70% |
| 2025 | 59.1 | 51.8 | 40.9 | 88% | 79% | 69% |
These ratios use Adjusted Allotments — what DA actually held — so they are not depressed by the FMR transfer (FMR never becomes a DA allotment). The decline to 69% is therefore a genuine within-DA delivery story: even setting aside the money that leaves the department, DA is converting a falling share of its releases into payments as the budget climbs.
absorp_ec <- df_long_all %>% filter(agency == "Office of the Secretary",
metric %in% c("AdjAllot","Disbursements"), expense_class %in% c("1PS","2MOOE","6CO"), year %in% 2018:2025) %>%
group_by(year, metric, expense_class) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = metric, values_from = amount) %>%
mutate(da = ifelse(AdjAllot > 1e8, Disbursements/AdjAllot, NA_real_),
expense_class = factor(expense_class, levels = c("1PS","2MOOE","6CO"),
labels = c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)","Capital Outlays (CO)")))
ggplot(absorp_ec, aes(year, da, color = expense_class, group = expense_class)) +
geom_line(linewidth = 0.9) + geom_point(size = 1.8) +
geom_text(aes(label = scales::percent(da, accuracy = 1)), vjust = -1.0, size = 2.8, show.legend = FALSE, color = "grey20") +
scale_color_manual(values = ec_pal) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.08), breaks = seq(0, 1, 0.2)) +
scale_x_continuous(breaks = 2018:2025) +
labs(title = "Disbursement-to-Allotment by Expense Class, 2018–2025",
subtitle = "PS and MOOE absorb at 87–99%; Capital Outlays struggles at 38–72% — the source of the aggregate drag",
x = NULL, y = NULL, caption = "Financial Expenses excluded (negligible base); CO here excludes FMR, which has no allotment.") +
theme_da() + guides(color = guide_legend(nrow = 1))
The aggregate weakness is, at root, a capital-execution problem. Personnel and operating spending clear at 87–99%; the Capital Outlays that DA actually holds disburse at only 38–72%. That is the equipment (PAEF), irrigation (INS), and project-type spending identified in the service and commodity cuts — physical procurement that DA struggles to turn into payments within the year.
abs_2025 <- osec_pap_year %>% filter(year == 2025, !is.na(AdjAllot), AdjAllot >= 5e8) %>%
mutate(`O/A` = Obligations/AdjAllot, `D/O` = Disbursements/Obligations, `D/A` = Disbursements/AdjAllot,
`Allotment (B)` = round(AdjAllot/1e9, 2))
Strongest absorbers, FY 2025 — established commodity programs (Corn PSS, R&D, general management) and the Rice PSS flagship.
abs_2025 %>% arrange(desc(`D/A`)) %>% slice_head(n = 7) %>%
transmute(`P/A/P` = str_trunc(pap, 54), `Allotment (B)`,
`O/A` = scales::percent(`O/A`, accuracy = 1), `D/O` = scales::percent(`D/O`, accuracy = 1),
`D/A` = scales::percent(`D/A`, accuracy = 1)) %>%
kbl_clean(font = 13, align = "lrrrr")
| P/A/P | Allotment (B) | O/A | D/O | D/A |
|---|---|---|---|---|
| Other Extension Support, Education and Training Ser… | 0.54 | 99% | 95% | 94% |
| Production Support Services (PSS) on the National C… | 3.39 | 99% | 93% | 92% |
| General Management and Supervision | 2.07 | 98% | 92% | 90% |
| Quality Control and Inspection | 0.54 | 98% | 88% | 87% |
| Production Support Services (PSS) on the National R… | 16.28 | 98% | 87% | 85% |
| Other Research and Development Activities | 1.22 | 95% | 89% | 84% |
| Development of Organizational Policies, Plans and P… | 0.54 | 95% | 86% | 82% |
Weakest absorbers, FY 2025 — equipment-provision (PAEF) lines and livestock, plus the aggregated Locally-Funded/Foreign-Assisted portfolio.
abs_2025 %>% arrange(`D/A`) %>% slice_head(n = 7) %>%
transmute(`P/A/P` = str_trunc(pap, 54), `Allotment (B)`,
`O/A` = scales::percent(`O/A`, accuracy = 1), `D/O` = scales::percent(`D/O`, accuracy = 1),
`D/A` = scales::percent(`D/A`, accuracy = 1)) %>%
kbl_clean(font = 13, align = "lrrrr")
| P/A/P | Allotment (B) | O/A | D/O | D/A |
|---|---|---|---|---|
| Provision of Agricultural Equipment and Facilities … | 1.85 | 56% | 47% | 27% |
| Production Support Services (PSS) on the National L… | 2.98 | 62% | 51% | 31% |
| Provision of Agricultural Equipment and Facilities … | 0.56 | 78% | 45% | 35% |
| Provision of Agricultural Equipment and Facilities … | 1.60 | 56% | 67% | 37% |
| Information and Communication Technology (ICT) Mana… | 0.79 | 61% | 72% | 44% |
| Locally-Funded and Foreign-Assisted Program | 10.21 | 77% | 69% | 53% |
| Operation and Maintenance of the Integrated Laborat… | 1.19 | 91% | 61% | 55% |
abs_full <- osec_pap_year %>% filter(year == 2025, !is.na(AdjAllot), AdjAllot > 0) %>%
transmute(`P/A/P` = pap, `Allotment (B)` = AdjAllot/1e9, `Obligations (B)` = Obligations/1e9,
`Disbursements (B)` = Disbursements/1e9, `O/A` = Obligations/AdjAllot,
`D/O` = ifelse(Obligations>0, Disbursements/Obligations, NA_real_), `D/A` = Disbursements/AdjAllot) %>%
arrange(`D/A`)
dt_table(abs_full, page = 15, money_cols = c("Allotment (B)","Obligations (B)","Disbursements (B)"),
pct_cols = c("O/A","D/O","D/A"))
trend_paps <- c(LFP_LABEL, FMR_LABEL, "Production Support Services (PSS) on the National Rice Program")
trend_dat <- osec_pap_year %>% filter(pap %in% trend_paps) %>%
select(pap, year, GAA, AdjAllot, Disbursements) %>%
pivot_longer(c(GAA, AdjAllot, Disbursements), names_to = "metric", values_to = "amount") %>%
filter(!is.na(amount)) %>%
mutate(metric = factor(metric, levels = c("GAA","AdjAllot","Disbursements"),
labels = c("GAA (enacted)","Adj. Allotment","Disbursements")),
pap = factor(pap, levels = trend_paps,
labels = c("Locally-Funded / Foreign-Assisted","Farm-to-Market Roads","National Rice Program PSS")))
trend_pal <- c("GAA (enacted)" = "#54278F","Adj. Allotment" = "#08519C","Disbursements" = "#31A354")
ggplot(trend_dat, aes(year, amount, color = metric, group = metric)) +
geom_line(linewidth = 0.9) + geom_point(size = 1.5) +
facet_wrap(~ pap, ncol = 3, scales = "free_y", labeller = label_wrap_gen(width = 22)) +
expand_limits(y = 0) +
scale_color_manual(values = trend_pal) +
scale_y_continuous(labels = php_b, breaks = pretty_breaks(4)) +
scale_x_continuous(breaks = c(2018, 2022, 2026)) +
labs(title = "How the three largest DA-OSEC programs have evolved (2018–2026)",
subtitle = "FMR shows zero execution at DA; LFP/FAP has the worst within-DA gap; Rice PSS executes most cleanly",
x = NULL, y = NULL) +
theme_da() + guides(color = guide_legend(nrow = 1))
The three panels capture the whole DA-OSEC story. Rice PSS (right) is the model: allotment and disbursement track the enacted budget closely. FMR (centre) is a flat zero for allotment and disbursement under a rising GAA. LFP/FAP (left) shows both pathologies — a GAA racing upward while allotment and especially disbursement lag far below.
The Department of Agriculture has nine attached agencies. Together they are about 11% of the department (₱20.8B of the ₱185.8B 2026 GAA); the Office of the Secretary is the other 89%. Execution data is not available for these units, so this section covers NEP and GAA only — what was proposed and what was enacted.
att <- df_long %>% filter(!is_osec, metric %in% c("NEP","GAA")) %>%
group_by(agency, year, metric) %>%
summarise(v = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop") %>%
filter(!is.na(v)) %>%
mutate(short = recode(agency, !!!short_map),
metric = factor(metric, levels = c("NEP","GAA"), labels = c("NEP (proposed)","GAA (enacted)")))
ord <- att %>% filter(metric == "GAA (enacted)", year == 2026) %>% arrange(desc(v)) %>% pull(short)
att <- att %>% mutate(short = factor(short, levels = ord))
ggplot(att, aes(year, v, color = metric, group = metric)) +
geom_line(linewidth = 0.8) + geom_point(size = 1.4) +
facet_wrap(~ short, ncol = 3, scales = "free_y", labeller = label_wrap_gen(width = 22)) +
expand_limits(y = 0) +
scale_color_manual(values = c("NEP (proposed)" = "#9E9AC8","GAA (enacted)" = "#54278F")) +
scale_y_continuous(labels = php_b, breaks = pretty_breaks(4)) +
scale_x_continuous(breaks = c(2018, 2022, 2026)) +
labs(title = "Attached agencies: NEP vs GAA, 2018–2027 (2027 = proposed, NEP only)",
subtitle = "BFAR dwarfs the rest; most others are small — and most are trimmed in the FY 2027 proposal",
x = NULL, y = NULL) +
theme_da() + guides(color = guide_legend(nrow = 1))
att_sum <- df_long %>% filter(!is_osec, metric %in% c("NEP","GAA")) %>%
group_by(agency, year, metric) %>%
summarise(v = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = metric, values_from = v) %>% group_by(agency) %>%
summarise(`GAA 2026 (B)` = round(GAA[year==2026]/1e9,2),
`NEP 2027 (B)` = round(NEP[year==2027]/1e9,2),
`Proposed chg 26→27 (B)` = round((NEP[year==2027] - GAA[year==2026])/1e9,2),
`Cumulative NEP→GAA, 2018–2026 (B)` = round(sum((GAA - NEP)[year <= 2026], na.rm=TRUE)/1e9,2),
.groups = "drop") %>%
mutate(Agency = paste0(recode(agency, !!!short_map), " — ", str_trunc(agency, 46))) %>%
select(Agency, `GAA 2026 (B)`, `NEP 2027 (B)`, `Proposed chg 26→27 (B)`, `Cumulative NEP→GAA, 2018–2026 (B)`) %>%
arrange(desc(`NEP 2027 (B)`))
kbl_clean(att_sum, font = 12.5, align = "lrrrr", na = "")
| Agency | GAA 2026 (B) | NEP 2027 (B) | Proposed chg 26→27 (B) | Cumulative NEP→GAA, 2018–2026 (B) |
|---|---|---|---|---|
| BFAR — Bureau of Fisheries and Aquatic Resources | 11.76 | 12.25 | 0.48 | 4.24 |
| ACPC — Agricultural Credit Policy Council | 3.11 | 2.86 | -0.25 | -0.14 |
| PCC — Philippine Carabao Center | 2.08 | 1.37 | -0.71 | 2.11 |
| NFRDI — National Fisheries Research and Development… | 0.74 | 0.74 | -0.01 | 0.05 |
| PhilFIDA — Philippine Fiber Industry Development Autho… | 0.68 | 0.66 | -0.02 | 0.29 |
| PHilMech — Philippine Center For Postharvest Developme… | 0.48 | 0.52 | 0.04 | 0.00 |
| NMIS — National Meat Inspection Service | 0.68 | 0.35 | -0.33 | 0.20 |
| PCAF — Philippine Council for Agriculture and Fish… | 0.26 | 0.31 | 0.05 | -0.13 |
| FPA — Fertilizer and Pesticide Authority | 0.42 | 0.26 | -0.16 | 0.03 |
Bureau of Fisheries and Aquatic Resources (BFAR) is by far the largest attached agency — ₱6.1B in 2018 nearly doubling to ₱11.8B in 2026 — covering fisheries production, monitoring/control/surveillance, post-harvest infrastructure, and aquaculture. It is also the most consistently augmented: cumulatively Congress added ₱4.2B over its proposals, most strikingly +₱1.9B in 2024. The World Bank–funded FishCORE (Philippine Fisheries and Coastal Resiliency Project) has grown into a ₱2B line, the agency’s second-largest, signalling a shift toward externally-financed coastal resilience.
Agricultural Credit Policy Council (ACPC) tripled from ₱1.1B to ₱3.1B, but is effectively a one-program agency: the Agro-Industry Modernization Credit and Financing Program (AMCFP) is about 97% of its budget, with all other lines together under ₱0.1B. Congress has been a slight net trimmer here over the period (−₱0.1B cumulative), including a notable ₱1.0B cut to the 2019 NEP. A single-program agency wrapped in management overhead invites the structural question of whether AMCFP needs its own agency at all.
Philippine Carabao Center (PCC) more than doubled into 2026 — from ₱0.5B (2018) to ₱2.1B — almost entirely because of a +₱1.1B Congressional add for a new school milk-feeding program (a component of DepEd’s School-Based Feeding Program) that had essentially no NEP line. That single insertion is now PCC’s largest item, eclipsing its core dairy-buffalo breeding and herd build-up work. It assigns a school-feeding delivery mandate to a small research-and-breeding agency.
National Fisheries Research and Development Institute (NFRDI) is the newest meaningful unit, with no DA line before 2020, growing to ₱0.74B by 2026. Its mandate is fisheries research distinct from BFAR’s operations. Research is about 63% of its budget; general management is a heavy ~31%, characteristic of a young, still-scaling institution. Congress has been almost entirely hands-off, enacting the NEP as proposed in nearly every year.
National Meat Inspection Service (NMIS) is a stable regulator — ₱0.6–0.7B across the period — overseeing meat establishments, importers/exporters, and inspection deputation. Its two core lines (inspection enforcement; importer/exporter registration) carry most of the budget, and since 2019 Congress has enacted the NEP unchanged every year.
Philippine Fiber Industry Development Authority (PhilFIDA) supports the abaca, cotton, silk, and other natural-fiber industries across production support, R&D, extension, and quality control. It is stable at ₱0.6–0.7B with only tiny Congressional adjustments, and carries one of the heaviest overheads among the attached units — general management is roughly 30% of the agency.
Philippine Center for Postharvest Development and Mechanization (PHilMech) focuses on postharvest technology, mechanization research, and farmer extension. It is remarkably static — ₱0.3–0.5B across nine years — and is the one agency whose NEP has been enacted as-is in every year, without a single peso of Congressional adjustment. Operationally it is essentially two lines, extension (ESETS) and R&D, mirroring its mandate.
Fertilizer and Pesticide Authority (FPA) regulates fertilizer and pesticide registration, licensing, and quality control. It had no DA line until 2019 (established by a +₱0.2B Congressional add when the NEP was zero) and has grown slowly to ₱0.42B, with the 2026 step-up its largest single-year increase. Two regulatory lines carry most of the budget.
Philippine Council for Agriculture and Fisheries (PCAF) is the smallest attached agency — ₱0.18–0.26B — a policy-coordination and partnership council rather than a field-delivery body. It is also the only attached agency Congress systematically trims: its NEP has been cut in several years (a −₱0.1B cumulative net), even as it grows gradually with the rest of the department.
Every attached-agency P/A/P, with NEP and GAA for FY 2025, 2026, and the FY 2027 proposal, and the proposed change from the 2026 enacted level. Search by agency short-name or program, and sort by the change column to see which lines the FY 2027 NEP grows or cuts. These agencies have no P/A/P-level execution data, so — unlike the OSEC master table — there are no utilization columns; the appropriations themselves are the lever advocates can act on before enactment.
att_full <- df_long %>% filter(!is_osec, metric %in% c("NEP","GAA")) %>%
group_by(agency, pap, year, metric) %>% summarise(v = sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = c(metric, year), values_from = v)
gc <- function(nm) if (nm %in% names(att_full)) att_full[[nm]] else NA_real_
att_full <- att_full %>% transmute(Agency = recode(agency, !!!short_map), `P/A/P` = str_trunc(pap, 62),
`NEP 2025 (B)` = gc("NEP_2025")/1e9, `GAA 2025 (B)` = gc("GAA_2025")/1e9,
`NEP 2026 (B)` = gc("NEP_2026")/1e9, `GAA 2026 (B)` = gc("GAA_2026")/1e9,
`NEP 2027 (B)` = gc("NEP_2027")/1e9,
`Proposed chg 26→27 (B)` = (gc("NEP_2027") - gc("GAA_2026"))/1e9) %>%
arrange(Agency, desc(`NEP 2027 (B)`))
dt_table(att_full, page = 15,
money_cols = c("NEP 2025 (B)","GAA 2025 (B)","NEP 2026 (B)","GAA 2026 (B)","NEP 2027 (B)","Proposed chg 26→27 (B)"),
money_digits = 3)
dept_totals <- df_long %>% group_by(year, metric) %>%
summarise(total = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop") %>%
filter(!is.na(total))
evo2 <- dept_totals %>% filter(metric %in% c("NEP","GAA")) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA"), labels = c("NEP (proposed)","GAA (enacted)")))
osec_exec <- df_long %>% filter(is_osec, metric %in% c("AdjAllot","Obligations","Disbursements")) %>%
group_by(year, metric) %>%
summarise(total = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop") %>%
filter(!is.na(total)) %>%
mutate(metric = factor(metric, levels = c("AdjAllot","Obligations","Disbursements"),
labels = c("Adj. Allotment (OSEC only)","Obligations (OSEC only)","Disbursements (OSEC only)")))
ev_pal <- c("NEP (proposed)" = "#9E9AC8","GAA (enacted)" = "#54278F",
"Adj. Allotment (OSEC only)" = "#08519C","Obligations (OSEC only)" = "#E6550D","Disbursements (OSEC only)" = "#31A354")
ggplot() +
geom_line(data = evo2, aes(year, total, color = metric, group = metric), linewidth = 1.0) +
geom_point(data = evo2, aes(year, total, color = metric), size = 2) +
geom_line(data = osec_exec, aes(year, total, color = metric, group = metric), linewidth = 0.8, linetype = "longdash") +
geom_point(data = osec_exec, aes(year, total, color = metric), size = 1.8) +
scale_color_manual(values = ev_pal, limits = names(ev_pal)) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = c(seq(2018, 2026, 2), 2027)) +
labs(title = "Whole Department of Agriculture: NEP/GAA (all units), execution (OSEC only)",
subtitle = "Department GAA grew from ₱53.3B (2018) to ₱185.8B (2026 enacted); the FY 2027 NEP proposes ₱171.3B",
x = NULL, y = NULL,
caption = "OSEC ≈ 89% of the department; attached agencies add ~₱19–20B but lack execution data. FY 2027 = NEP (proposed).") +
theme_da() + guides(color = guide_legend(nrow = 2, byrow = TRUE))
share <- df_long %>% filter(metric == "GAA", year <= 2026, !is.na(amount)) %>%
mutate(grp = ifelse(is_osec, "Office of the Secretary", "All attached agencies")) %>%
group_by(year, grp) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(grp = factor(grp, levels = c("Office of the Secretary","All attached agencies")))
ggplot(share, aes(year, amount, fill = grp)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = c("Office of the Secretary" = "#08519C","All attached agencies" = "#D9D9D9")) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "DA total GAA: OSEC vs. attached agencies, 2018–2026",
subtitle = "OSEC was 82% of the department in 2018, 89% in 2026 — growth has been concentrated in OSEC",
x = NULL, y = NULL) +
theme_da() + guides(fill = guide_legend(nrow = 1))
The Executive has concentrated the department’s growth in the Office of the Secretary, whose share rose from 82% to 89%. The attached agencies — with the partial exception of BFAR and the Congressionally-boosted PCC — have grown only slowly.
dept_top <- df_long %>% filter(metric == "NEP", year == 2027, !is.na(amount), amount > 0) %>%
group_by(agency, pap) %>% summarise(NEP = sum(amount, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(NEP)) %>% slice_head(n = 15) %>%
transmute(Agency = recode(agency, !!!short_map), `P/A/P` = str_trunc(pap, 64), `NEP 2027 (B)` = round(NEP/1e9,2))
kbl_clean(dept_top, font = 12.5, align = "llr")
| Agency | P/A/P | NEP 2027 (B) |
|---|---|---|
| Office of the Secretary | Locally-Funded and Foreign-Assisted Program | 76.87 |
| Office of the Secretary | Production Support Services (PSS) on the National Rice Program | 25.62 |
| Office of the Secretary | Repair/Rehabilitation and Construction of Farm-to-Market Road… | 16.00 |
| Office of the Secretary | Extension Support, Education and Training Services (ESETS) on… | 3.33 |
| Office of the Secretary | Provision of Agricultural Equipment and Facilities (PAEF) on … | 3.03 |
| Office of the Secretary | Modernization and Strengthening of Production and Research Fa… | 2.87 |
| Office of the Secretary | Field Program Management Activities | 2.84 |
| Office of the Secretary | Production Support Services (PSS) on the National Corn Program | 2.79 |
| ACPC | Agro-Industry Modernization Credit and Financing Program (AMC… | 2.78 |
| Office of the Secretary | General Management and Supervision | 2.60 |
| BFAR | Fisheries Production and Distribution | 2.01 |
| BFAR | Operation and Management of Production Facilities | 1.89 |
| Office of the Secretary | Operation and Maintenance of the Integrated Laboratories | 1.82 |
| BFAR | Philippine Fisheries and Coastal Resiliency Project (FishCORE… | 1.80 |
| BFAR | Monitoring, Control and Surveillance | 1.67 |
These follow directly from the FY 2027 proposal and the OSEC spending record in the master tables above.
Underlying data: DBM-published budget and execution data for the DA Office of the Secretary (Current New Appropriations only), FY 2018–2027; NEP/GAA only for the nine attached agencies. FY 2027 is the NEP (the Executive’s proposal) only, with no execution data; FY 2026 reflects NEP/GAA only; OSEC execution (Allotments, Obligations, Disbursements) covers FY 2018–2025, so the most recent per-P/A/P utilization shown is FY 2025. Service-type and commodity aggregations are parsed from P/A/P labels and cover the commodity operational core (PSS, ESETS, MDS, R&D, PAEF, INS), excluding FMR, LFP/FAP, administration, and regulatory lines. Farm-to-Market Roads and the Locally-Funded and Foreign-Assisted Program are each presented as single aggregates of many itemized sub-projects. Prepared as the long-form companion to the DA budget briefing.