Modeling decisions for 221100 sector disaggregation #85
Replies: 7 comments 31 replies
-
1. Schema expansion — keep the 405-sector taxonomy, expand to 407 only when disaggregation is onImplementation: When electricity disaggregation is enabled, the model needs two more sector codes than the standard Cornerstone table. We chose not to change the canonical 405-sector taxonomy, type definitions, or BEA correspondences that the rest of the codebase relies on. Instead, disaggregation produces 407-sector Make/Use tables only on the flag-on path, with parallel 407-sector schema lists and validation that switches based on config. Downstream matrices (A, q, B, and related quantities) inherit the expanded size automatically once the underlying V/U bundle is 407-wide; a few paths that still assume 405 (validation, expanded gross-output series, emissions) are handled explicitly. Modeling implications: Configs with the flag off behave exactly as before. Configs with the flag on expose three distinct electricity industries in IO and attribution results, without forcing every consumer of the 405-sector schema to become config-aware. The tradeoff is intentional duplication of schema logic (405 vs 407 variants) rather than a single taxonomy that morphs at runtime. |
Beta Was this translation helpful? Give feedback.
-
2. Make table disaggregation — BEA gross-output shares as the split weightsImplementation: Because of the reallocation step performed prior to the disaggregation, the only value in the Make table for the electricity industries and commodity resides in the Make table intersection (i.e., diagonal) of This intersection must be divided among generation, transmission, and distribution. We anchor that split to BEA detail gross output for the ten electricity-related sectors in UGO305-A: eight generation types plus transmission and distribution. Each sub-sector's weight is its gross output divided by the sum of those ten sectors only (not the full BEA table), so the three Cornerstone weights sum to 1. This step applies these weights to split the Make diagonal while preserving total Make row and column totals for electricity. These disaggregated industry and commodity totals are then used as constraints for the following steps in the disaggregation. Modeling implications: The aggregate electricity output in the model stays anchored to the reallocated Make table. BEA UGO305-A (2017) supplies only the relative gross-output shares used to divide that total among generation, transmission, and distribution. The relative size of gen vs T&D in the disaggregated model therefore reflects BEA's 2017 output mix, not proportions implied by the single aggregate IO cell (which has no internal structure). All later disaggregation steps reuse the same three weights for consistency. |
Beta Was this translation helpful? Give feedback.
-
3. Use table intersection — diagonal-only electricity block (high priority for revision)Implementation: The Use table has a matching "electricity into electricity" block (the intersection of electricity commodity rows and electricity industry columns). Currently, we split that block only on the diagonal: generation buys only the generation commodity, transmission only transmission, distribution only distribution. Off-diagonal cells in the 3×3 block are zero — there is no modeled purchase of transmission or distribution as electricity commodities by other electricity sub-sectors, and no cross-flow between T&D sub-sectors. Modeling implications: This is a deliberate simplification of within-sector electricity flows. While this simplies the implementation and balancing of subsquent disaggregation steps, in reality generation may consume grid services while the T&D industries use electricity themselves; those relationships are not represented in the monetary IO structure after the current disaggregation. Indirect effects can still appear through other commodities (fuels, services, etc.), but direct electricity-for-electricity links between sub-sectors are absent. Related discussion: #70 |
Beta Was this translation helpful? Give feedback.
-
4. Use table column disaggregation — fuel routing and value-added balancingImplementation: This step splits the 221100 industry column in the Use table and Value Added rows — everything the electricity sector buys as inputs. This cannot reuse the generic waste-disaggregation column logic because each disaggregated column must balance to its own gross-output target. Before splitting, we check that the aggregate electricity industry satisfies the standard gross-output identity (Make row total equals domestic + imported intermediate use + value added, using total use including imports). Small residuals are absorbed into aggregate value added with a warning; large mismatches fail loudly. Input rows are then assigned by rule: fuel commodities go entirely to generation (coal, oil & gas, refining, petroleum products, natural gas); all other non–value-added rows split by the same gross-output shares as in the Make table disaggregation; value added is computed as the residual so each column sums exactly to its target gross output, distributed across compensation/proprietors/taxes in proportion to the original aggregate VA mix. Any negative VA that results from this implementation is retained with a warning rather than clipped, though in reality this is unlikely to happen as VA is over 60% of the total Modeling implications: Generation carries essentially all fuel purchases; T&D columns are dominated by services and VA rather than fuels — consistent with physical intuition but enforced by rule, not by BEA detail Use data at this granularity. VA acts as the balancing item, so generation can show small or even negative VA if fuel assignments exceed its gross-output share, while distribution VA is comparatively large. That skew affects input coefficients (A) for those columns and can interact with A scaling caps in non-base years (see the Cross-year scaling alignment decision). |
Beta Was this translation helpful? Give feedback.
-
5. Use table row and final demand — equal-price split across all consumers (high priority for revision)Implementation: This step splits the 221100 commodity row — electricity purchased by every other industry and by final demand. We assume consumers face a single blended retail price, so every non-intersection cell in that row (and the corresponding final-demand entries) receives the same gen/T/D proportions. Conceptually, each sub-commodity row should "market-clear" to its gross-output share of total electricity supply; because the Use table intersection decision already placed the intersection using the same weights, that condition reduces to applying the shared weights w everywhere on the row. Any change to that decision will affect this step, but currently the Use (domestic and imported) and final demand are split independently with the same weights. Modeling implications: All downstream purchasers of electricity — households, other industries, exports — inherit the same gen/T/D mix in their direct electricity purchases. The model does not distinguish, for example, high-voltage transmission service sold to industrial customers vs. distribution to residences at this step. Totals are preserved: summed disaggregated electricity consumption equals the original aggregate row. Differentiated consumer-level pricing or T&D-specific sales requires additional rules beyond equal-price proportional splitting. More broadly, while this decision is still done using monetary units, it is analogous to the decision of how many MWh of consumption to assign to each industry/FD when we introduce physical units. As a result, it is worth discussing and revising now if necessary in preparation for that step. Related discussion: #70 |
Beta Was this translation helpful? Give feedback.
-
6. Emissions (E) attribution at 407 sectors and use for BImplementation: E (numerator) — primary path: Emissions intensity (B) is E (numerator). The preferred source is the eGRID-based GHG inventory, which already resolves plant-level combustion to generation NAICS and SF6 to transmission; with an updated activity-to-sector crosswalk, emissions land on 221110 and 221121 directly — no Make row shares involved. If eGRID is unavailable, a fallback routes aggregate 221100 emissions by gas type: SF6 to transmission (221121), other listed GHGs to generation (221110). Distribution (221122) receives negligible direct GHG under both paths (SF6 is attributed to transmission). x (denominator). Make-table row shares are used only when B takes x from the BEA gross-output time series expanded to Cornerstone ( Modeling implications: Generation dominates direct power-sector GHG; transmission carries SF6; distribution is effectively zero direct emissions — a physically reasonable split for E, but not a full lifecycle or locational attribution. Indirect emissions from fuel supply chains remain in upstream sectors (e.g., fuels assigned to generation in the Use table column disaggregation decision). The Make row-share split affects E/x ratios (and therefore B) only on configs that align E to the GHG data year while using BEA time-series gross output as the denominator; it does not change how emissions are inventoried, only how the aggregate Utilities gross-output total is apportioned among the three electricity industries for normalization. |
Beta Was this translation helpful? Give feedback.
-
7. Cross-year scaling alignmentImplementation: When scaling 2017 IO structure to the model year, BEA summary tables provide one price index per summary sector. Aggregate 221100 maps to BEA summary code "22" (Utilities). After disaggregation, 221100 no longer exists in the matrix; we replace it with the three child codes in the summary→Cornerstone map so all three inherit the same Utilities summary ratio as the parent would have. This is a replace, not an append — leaving 221100 in the map would error once the aggregate column is gone. Modeling implications: Generation, transmission, and distribution scale identically across years — same relative structure as the pre-disaggregation aggregate sector had. The disaggregation introduces sector detail within 2017 dollars but does not, by itself, introduce differentiated year-over-year growth rates among the three electricity sub-sectors. For a 2017-base config this is a no-op; for model years like 2023 it prevents the three new codes from silently staying at 2017 levels while the rest of Utilities scales. If generation's VA went negative (decision 4), year scaling may further adjust that column through the A-matrix sum cap (0.98), which is a known coupling worth monitoring in diagnostics. More broadly, this scaling adjustment for the disaggregated sectors is needed regarless of the intended replacement of monetary units for physical units for these sectors. That replacement is intended to be implemented at the IO model target year rather than during the 2017 disaggregation procedure (i.e., after scaling) to allow the scaling procedure to work as-is with full monetary values. Note that this implementation is focused on the current bedrock scaling path; any changes to this path based on the broader scaling discussion will need to be accounted for here. Whether it makes sense to deviate from the current scaling for the disaggregated electricity sectors or not (e.g., by using the BEA Gross Detailed Output data for target years instead of scale + inflate) before replacing them by physical units is an open question but one that was not implemented here. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
This discussion is meant to list the modeling decisions used in the implementation of the
221100disaggregation.There are 7 decision points discussed in independent comments under this discussion. My suggestion for feedback to this approach is to provide feedback in the order the decisions are posted and to resolve them in that order, as any changes to earlier decisions will affect later ones.
I would like to emphasize that the reason why disaggregation is (initially) built as described in this discussion is for ease of implementation to get something working in the code, rather than as a suggestion that they were the "right" implementation options to make for any of the decisions below. As a result I expect we will modify the code based on the consensus we reach in this discussion for all the decisions.
Below is a summary of the decisions implemented in this approach, and a report with the final status of the disaggregation after implementing these decisions.
Summary table
Beta Was this translation helpful? Give feedback.
All reactions