Modeling decisions for EIA-anchored electricity disaggregation #88
Replies: 17 comments
|
D0. Purchaser generation / T&D package Implementation (intended): In today’s 3-way split, compensating row weights restore BEA UGO305 G/T/D dollar Use+Y totals after a Table 8.3 3×3. Mixed units then put class retail gaps into generation-row conversion factors ( Forcing BEA GO row-dollar totals, EIA class MWh, and one national generation price Five purchaser classes. Four Table 2.2 classes (Residential, Commercial, Industrial + Direct Use, Transportation) plus Exports ( Class MWh. Four Table 2.2 classes get shares of Total End Use times (eGRID − Table 2.14 Canada+Mexico export MWh) — not EIA sales MWh as published, and not shares × full eGRID. Keep the
There is no EIA series in the current extract that is “generation GO $.” UGO is required; missing UGO is an error. Table 8.3 Production share (~87% gen) is not a Not chosen for exports: parking the eGRID − end-use gap on Dollar toy. Electricity Use+Y $100; Steel $40, shop $30, households $30; generation-dollar share 34% → generation $34, leftover $66. Leftover T&D dollars are D8 (each purchaser’s bill minus generation $). Make-last is D2. Modeling implications: Generation output and domestic generation use both equal eGRID. Household generation MWh will exceed published Residential sales. All-in ¢/kWh will not equal Table 2.4. Commercial MWh get closer to Table 2.2 Commercial. Leftover T&D on the export column is D8 uniformity, not a physical claim that exported kWh travel US distribution. 2017 bills look slack ( Resolution: Four Table 2.2 class MWh = EIA Total End Use shares × (eGRID − Table 2.14 export MWh); Industrial includes Direct Use; |
|
D1. Use 3×3 and generation self-use Implementation (intended): The 3×3 of electricity industries buying electricity commodities decides (1) whether T/D total EFs pick up generation combustion through L (off-diagonal purchases) and (2) whether extra generation MWh sit outside the D0 class buckets. Not putting generation emissions into T/D EFs is the more important EF choice, so off-diagonals stay 0. Direct Use is not a separate cell: it is inside the Industrial+Direct Use share of (eGRID − export MWh). The generation industry column has no T&D leftover (D8). T/D diagonal cells take the rest of Modeling implications: T/D total EFs do not inherit generation’s direct intensity through this block. Resolution: Off-diagonals = 0. |
|
D2. Make table — Make-last Implementation (intended): Reverse today’s order. Build commodity rows + Y (and the Use 3×3) first, then After co-production cleanup, electricity Make is a diagonal 3×3, so commodity output Make-last: after D0/D1/D8 produce generation / T / D commodity-row totals (intermediate Use plus Y), set the three Make diagonal cells so each child’s share of aggregate This is not copying the Use 3×3 into Make. Modeling implications: BEA’s 34/4/62 is no longer who produces G/T/D. UGO is still used for the generation-dollar share (D0) and leftover T vs D (D14). The published CF Make-last percentages (35.8 / 3.8 / 60.4) were sales-only gen dollars and are not the production mix. Resolution: Make inherits the Use+Y G/T/D split. Do not use BEA GO shares for Make. |
|
D3. Industry columns + value added Implementation (intended): Make-last sets how large each G/T/D industry is ( Default: same recipe as production, Make-last weights instead of BEA GO. Fuels → generation (100%). Other non-electricity rows ∝ Make-last shares. Backup if default If the backup is not enough (fuels + Modeling implications: Fuels stay on the industry that burns them. The only repair is moving non-fuel intermediates, which does not leak fuel-chain EFs onto T/D. Negative generation VA remains possible in the pathological case. T&D-as-markup columns (VA absorbs leftover) were not chosen. Resolution: Option 1 with Make-last weights. Spill other non-fuel if |
|
D4. Mixed units Implementation (intended): Replace Mixed units convert generation from dollars to MWh and leave T&D in dollars. Today’s class-varying Option 2: eGRID constrains generation on Make ( Modeling implications: Class generation MWh from D0 survive mixed units. We give up one shared conversion factor. D6’s Make-last after re-anchor makes Resolution: |
|
D5. eGRID minus EIA end use eGRID exceeds EIA Total End Use. That gap is generation that is not EIA end use (losses, plant use, and the part of trade not peeled off as D0 exports). The diagnostics counterfactual left the gap off the Use row. D0 already smears eGRID − export MWh − Total End Use across the four Table 2.2 classes. Illustration: 2018 eGRID 4,168 TWh minus EIA Total End Use ~3,864 TWh ≈ 304 TWh (CF working table, before peeling exports onto Modeling implications: Scaled four-class MWh are not EIA delivered consumption. There is no explicit losses / plant-use generation cell. Exports are on Resolution: No extra Use-row cell. The remaining gap exists only as D0 scale-up on the four Table 2.2 classes. Direct Use stays inside Industrial’s share. Exports are D0 ( |
|
D6. Year scaling Implementation (intended): Leave The 3-way split is built on 2017 detail tables. The published model is a later year (e.g. 2024). Today, after disaggregation, all 407 sectors get BEA summary-sector growth. Electricity children sit in Utilities If we only inflate 2017 D0 dollars, 2024 class MWh is the 2017 EIA mix grown, not the 2024 Residential/Industrial mix. D0 as a model-year identity wants EIA 2.2 shares × (eGRID − 2.14 exports) at the model year, plus that year’s Table 2.14 on Ruled out: split-last (2017 3-way must still go through the same summary inflation as flag-off). Scale-only with no EIA re-anchor. Chosen: keep 1a (per-child GO growth) as an intermediate, then re-apply D0, then Make-last again. 1a does not last on electricity D6 does not keep the 2024 UGO generation share. 1a would temporarily change gen’s share of Toy. 2017 Use+Y and Modeling implications: The inflation mechanism is unchanged when the electricity flag is on. Published electricity Resolution: 1a as intermediate; re-apply D0 at the model year; re-run Make-last so published |
|
D7. Emissions E and B Implementation (intended): Leave eGRID FBS mapping and Direct emissions E are an industry fact (who combusts). Intensities B = E / x (then mixed units divide generation B by Keep production placement:
Leftover T&D can be a large $ industry. Putting combustion E there would make T/D look carbon-intensive because they are a markup, not because they burn fuel. Modeling implications: D0 changes purchaser N (who buys gen MWh). T/D D stay near zero except SF₆ on T. Generation Resolution: Keep production E/B placement. Do not put combustion on leftover T&D. Do not use a BEA-GO denominator for B. |
|
D8. Leftover T&D dollars, clip, map, Y Implementation (intended): For each non-electricity purchaser, domestic bill = Generation dollars are already set (class MWh × one generation price). What remains is leftover T&D on each purchaser, and whether that changes that purchaser’s electricity bill. Changing bills to follow EIA retail-price gaps would move $ off industries onto households and force a VA repair (or break Option 3 (leave industry bills alone, put the leftover pattern only in Y) was ruled out — it would not model industry electricity use more accurately. Option 2 (change bills, VA absorbs) hits an EIA leftover-dollar pattern but rewrites sector VA; when $ move onto households, national industry VA rises. Option 1 (chosen): keep each purchaser’s electricity $ (the old If generation $ would exceed that purchaser’s bill, water-fill the clipped $ onto others in the same class so leftover is not negative and class MWh still hit D0. Do not cut generation $ to match an EIA retail bill. Nibble that class only if class bills < Domain. No leftover on the generation industry column (D1). Dollar toy. Electricity Use+Y $100; Steel $40, shop $30, households $30. Generation $ stay $34. EIA shares put about 29% / 35% / 36% of generation on Steel / shop / HH, so generation $ ≈ $10 / $12 / $12.
Modeling implications: Industry columns stay balanced without moving VA. End-use classes still differ in generation vs leftover mix via D0. Leftover $ by class will not follow Table 2.4 price gaps. All-in ¢/kWh will not equal Table 2.4. A class-level nibble of D0/eGRID MWh remains possible if that class's bills cannot cover Resolution: Keep each purchaser’s electricity |
|
D9. Config flags Implementation (intended): No new flags in P0 first (on today’s code, before replacing the 3-way): run today’s 3-way and mixed-units waterfall configs and write a committed snapshot under Today there are three electricity switches: reallocation, 3-way split, mixed units. A fourth switch would keep the old 3-way around for comparison but adds config surface and waterfall states. Modeling implications: Old vs new in one checkout is a committed freeze of today’s production, not a live dual path. Waterfall config names stay: footing → co-production cleanup → 3-way split (this method) → mixed units (this conversion). Resolution: Do not add flags. Replace 3-way-split and mixed-units implementations in place. Compare to the P0 freeze, not to a second production flag. |
|
D10. Electricity self-use 3×3 Implementation (intended): After D0 writes D8 leftover is retail bill minus generation $ for Steel / shop / HH. Self-use is an intersection cell. Do not unbundle it with leftover language. Place the cell on the diagonal. Aims: (1) do not lose dollars of old
The construction that hits all four:
If D1 Dollar toy. Use+Y $100, domestic self-use Modeling implications: Circular T/T and D/D self-use is ordinary IO; it does not put generation emissions on T/D through this block. T and D industries buy their own commodities. Resolution: Keep the whole self-use cell. |
|
D11. Imports vs the eGRID cap Implementation (intended): D0/D8 eGRID allocation on domestic bills only. Place import eGRID is US plant net generation (domestic output). BEA also has imported electricity. D0/D4 said generation Use+Y MWh = eGRID = Today’s mixed units already pick the domestic identity: preserve domestic row MWh = eGRID, then apply the same Option 1: domestic generation Use+Y MWh = eGRID = Bedrock eGRID on this path is plant net generation only ( Modeling implications: Output = domestic use, not all use. Four-class MWh shares × (eGRID − exports) describe domestic ultimate-customer use of US generation. Export MWh are D0. Imports are extra supply on the generation row. Resolution: Domestic Use+Y MWh = eGRID = |
|
D12. 2017 eGRID proxy Implementation (intended): Helper Current production: mixed units in D0/D4/D11 use eGRID MWh as domestic generation output. The 3-way split is built on 2017 detail tables. Stewi eGRID inventories in bedrock are 2014, 2016, 2018–2024 — no 2017. D6 already re-applies D0 at the model year with that year’s real eGRID, so this proxy does not set published Option 4: estimate 2017 eGRID from the EIA 2016→2017 trend:
Table 3.1 is all-sector net generation (3.1.A fossil/nuclear/pumped storage + 3.1.B renewables, including estimated small-scale solar). Assumption: the eGRID/EIA coverage ratio is stable from 2016 to 2017. Calculation (bedrock, 2026-08-22):
Not chosen: raw eGRID 2018 (4,168 TWh, the CF proxy, 2.7% above EIA 2017); raw eGRID 2016 (misses the 2016→2017 dip); raw EIA 3.1 2017 (not eGRID coverage); 2018-backward twin (4,019 TWh). Knock-on for D11 on the 2017 chain: Modeling implications: The 2017 chain does not bit-match the published CF’s 2018 proxy. The estimate is documented and reproducible from on-disk EIA 3.1 + eGRID 2016. Resolution: 2017-chain eGRID = eGRID 2016 × (EIA 3.1 2017 / EIA 3.1 2016) = 4,039 TWh. Model year still uses that year’s real eGRID (D6). |
|
D13. Negative Use/Y cells Implementation (intended): D0 splits each Table 2.2 class’s MWh among purchasers in proportion to their electricity dollars. A negative dollar cell then wants negative MWh. That is a different clip from D8 (water-fill / nibble on a positive bill). On 2017 BEA detail Resolution: Clip to 0 only when forming within-class dollar shares. No purchaser gets negative MWh. Do not rewrite live Use/Y cells to 0. Exclude F05000 and F04000 from Table 2.2 class weights (D0: imports extra; Exports is its own class). On a rare negative industry bill: generation $ = 0, leftover stays that negative cell (D8 leftover ≥ 0 does not bind there). F05000 is not a D8 purchaser. F04000 is a D8 purchaser. Modeling implications: Matches the CF weight clip. Keeps |
|
D14. Leftover T vs D year Implementation (intended): T/(T+D) from 2017 UGO in D8 leftover on each (positive) purchaser is bill minus generation $. That leftover pool is split transmission vs distribution with UGO T/(T+D), not the full G/T/D mix. D10 uses the same T/(T+D) for the self-use remainder. D0 already froze the generation-dollar share at the 2017 UGO ratio even after year scaling. D14 is whether T/(T+D) is also frozen at 2017. UGO T/(T+D) barely moves: 2017 5.92% / 94.08%; 2024 6.03% / 93.97%. Generation’s share of G+T+D does move in UGO (2017 34.2% → 2024 30.6%). That is not the published D6 mix (1a does not last).
Using 2024 T/(T+D) would mix UGO years: 2017 for gen-vs-leftover, 2024 for leftover T vs D. Using 2024 UGO for generation share as well would reopen D0. Toy. Leftover $66. 2017 split → T $3.91, D $62.09. 2024 split (not used) → T $3.98, D $62.02. Generation $ still $34; Modeling implications: Leftover T vs D stays on the same 2017 UGO structure as the generation-dollar share. The year-to-year T/(T+D) gap is ~0.1–0.3 percentage points. Resolution: Freeze 2017 UGO T/(T+D) (~5.92% / 94.08%) on the 2017 chain and after D6. |
|
D15 (historical). Exports as a D0 class — merged into D0 This comment is not a later override. Physical exports as their own class ( Settled 2026-08-22, then folded into D0 so Discussion #88’s “earlier decisions constrain later ones” holds. Permalink kept so older links still resolve. Resolution: See D0. Do not treat this comment as a sixteenth independent decision. |
|
Phi on disaggregated electricity Implementation (intended): When D8 leftover T&D is a producer-price split of each purchaser’s old USEEIO Phoebe Modeling implications: Leftover T&D stays in the producer-price Use table (D8). Phi = 1 on G/T/D does not add a second markup on electricity’s own Resolution: Phi = 1 on the three electricity children when the 3-way flag is on, matching Phoebe on |
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 lists the modeling decisions for putting an EIA-anchored generation / transmission / distribution path into Cornerstone production. It replaces today’s 3-way split and mixed-units conversion (Discussion #85). Co-production cleanup is unchanged. The 405-sector canonical schema is unchanged (407 outputs still only when the existing electricity flag is on).
There are 15 decision points (D0–D14) in independent comments below, then a Phi note. Please comment in that order; earlier decisions constrain later ones. (A former D15 comment remains as a historical pointer: exports as a class were merged into D0.)
These are the intended production methods, not a diagnostics overlay. Code is not in this discussion; a separate implementation plan will cite these decisions.
Methods record (downloadable). eia_anchored_gtd_methods_record.md (raw download) is the living methods log for this replacement: settled design (guiding principles, D0–D14, Phi), the discussion log (why each decision was made, including options not chosen), and implementation notes. Use it as the source of truth if a comment and the log ever disagree. It is not the code implementation plan.
Guiding principles
F04000(Table 2.14), not Commercial. Inside each class, MWh still follow who already buys electricity in the IO table.us_total_net_generation_mwh). GGL interconnect-loss helpers exist but are not added to this cap. EIA class shares only divide that total among industries and final demand. There is no 2017 eGRID, so the 2017 tables use an estimate (~4,039 TWh). The published 2024 model uses 2024 eGRID.p × class MWh.We do not add new on/off switches for this method. Using manufacturing survey kWh inside Industrial is later work.
Summary
“Current production” is today’s live 3-way split plus mixed-units conversion (#85 as implemented).
F04000is the Exports class (Table 2.14 MWh);F05000is not a class; within class ∝ electricity $;pnumerator = 2017 UGO gen share of221100(same share after year scaling)w_rowforces the UGO G/T/D dollar mix on every purchaser. No EIA class MWh. Mixed units then warp class MWh via Table 2.4.F04000sits in Commercial.U[G,G]= generation industry’s slice of Industrial+Direct Use; off-diagonals 0; no Table 8.3 stacked on those MWhVA_Gwould go negativec_col= eGRID /q_$;c_row= 1/p(flat). Table 2.4 out. T&D stay dollars. Domestic Use+Y MWh = eGRID (class nibble is D8)c_rowvaries by EIA class (∝ 1 / Table 2.4). Households get ~38% of Residential generation MWh.F04000holds Table 2.14 only (D0)derive_cornerstone_Aq_scaled, 3-way flag) and Make-last. Publishedqfollows that year’s EIA MWh mix. D8 bills from the pre-1a row sumqand A rows (after summary"22").B_gen/=c_col. Split GHG-year parent GO with P5qshares, not 2017 V. Do not overwrite 2017 Vxtoday follows UGO Make V.221100p × class MWh. Split leftover with 2017 UGO T/(T+D).Uimp100% generation;F04000is a D8 purchaser (Exports class from D0). Do not reassign leftover using Table 2.4221100.T_dom = Udom[221100,221100];Udom[G,G]from D1 clipped toT_dom; remainder onUdom[T,T]/Udom[D,D];Uimpintersection →Uimp[G,G]only; off-diagonals 0q. Extra import MWh = abs(Y[221100, F05000]) /p. Imported221100is generation onlyAimp. Imports still get the UGO/w_rowG/T/D mix, not 100% generation.model_base_yearmodel_base_year(canonical 2024). The 2017 3-way is monetary and does not call eGRID. 2018 was the diagnostics CF proxy, not live production.F05000andF04000out of Table 2.2 weights per D0p. D8 already uses this freeze; this comment is the year-choice recordqfollows UGO GO growth (model-year mix).221110/221121/221122(same as USEEIO Phoebe on221100). Leftover T&D is D8, not a Phi haircut221100already has Phi = 1 in Phoebe. Children get 1 today only viareindexfill.All reactions