Skip to content

R pipeline

Jip Claassens edited this page Aug 17, 2026 · 2 revisions

R-pipeline

De actieve keten van ruwe leveringen naar hedonische schattingen, in R/ (R 4.5.x, data.table + haven + fixest). Vervangt de Stata-flow.

R/README.md in de repo is de gedetailleerde referentie — inclusief de volledige lijst bewuste afwijkingen van de oude Stata-flow. Deze pagina geeft het overzicht en de dingen die je vooral moet weten als je de keten opnieuw draait.

Stappen

stap script doet output
1 01_merge_sources.R twee leveringen harmoniseren: oud NVM-format (1985–2021) + Brainbay (2000–2023) 01_merged_<tag>.rds
2 02_clean.R filters, adresopschoning, ontdubbeling van de overlap 2000–2021, huis-id's voor repeat sales 02_cleaned_<tag>.rds
3 03_export_geocode.R slank adresbestand voor de geocoder NVM_adressen_<tag>.csv
GeoDMS (BAG-Tools) geocoderen: adres → x/y + BAG-attributen ..._Geocoded.csv
4a 04a_merge_geocode.R terugkoppelen op geocode_id, filteren op matchkwaliteit, BAG-sentinels → NA, bouwjaar consolideren 04a_geocoded_<tag>.rds
3b 03b_export_spatial_input.R slim-CSV voor de GeoDMS-spatial-pass ..._<tag>_slim.csv
GeoDMS (deze repo) spatial variabelen ..._<tag>_slim_spatial.csv
4 04_import_spatial.R spatial vars terugkoppelen op obsid, schonen, afgeleiden (lnprice, bouwperiode, …) 04_analysis_<variant>_<tag>.rds
5 05_estimate.R OLS per WP4-type met HC1-robuuste SE, spec-gestuurd Estimates_<tag>_<spec>_<type>.csv
6 06_volatility.R lokale prijsvolatiliteit per regio Volatility_<tag>_<korrel>.csv

Draaien:

Rscript R/run_all.R          # 1 t/m 3
Rscript R/run_all.R 4a 3b    # na de geocodeerronde
Rscript R/run_all.R 4 5      # na de spatial-pass
Rscript R/run_all.R 6        # volatiliteit (los)

Alle paden en parameters staan in R/00_config.R. Dat script zoekt de OneDrive-map machine-onafhankelijk op en leidt %LocalDataDir% / %SourceDataDir% uit de GeoDMS-registerinstellingen af.

Twee handshakes met GeoDMS

  1. Geocoderen. Sleutel is geocode_id. 04a doet een integriteitscheck: wijzigt de schoningslogica, dan verschuiven de id's en moet je opnieuw geocoderen onder een nieuwe tag. Default gaan alleen matches t/m PC6-niveau mee (cfg$geocode_max_niveau = 13).
  2. Spatial vars. Sleutel is obsid (= trans_id). cfg$tag in R en nvm_filedate in main.dms moeten dezelfde waarde hebben — anders koppelt stap 4 tegen de verkeerde levering aan.

Specs (stap 5)

Een spec bundelt: naam, invoervariant, locatievariabelen, sampleperiode en wel/niet limit. Actief per default: redev en rs_groen.

Het model zelf (semi-logaritmisch, per WP4-type, met HC1-robuuste SE) en de inhoudelijke onderbouwing van de variabelenkeuze staan beschreven op Hedonisch woningprijsmodel in de RSopen-wiki.

spec wat
redev modelset van het densification-paper: lntt_500k_2024, lntt_ovknoop, uai_2012, plus d_hoogte_onbekend bij appartementen
rs_groen redev + fr_natuur_tot2500m + fr_water_500m — de set die de RuimteScanner leest (waardering groen), zie Koppeling met RuimteScanner
rsval, rsval_limit reproductie van de Stata-run 20251024; bevroren ijkpunt voor 99_validate_vs_stata.R
rs_groen_donut, rs_groen_vol, rs_groen_g500, rs_groen_g100 groensensitiviteiten
redev_tt2020 oude 500m-reistijd i.p.v. de 2024-versie
redev_limit alleen lnsize als objectkenmerk; geen actieve afnemer meer

Sensitiviteit draaien: specs_actief <- "redev_tt2020" zetten vóór source("05_estimate.R").

Twee vastgelegde keuzes die je niet per ongeluk moet terugdraaien:

  • tt_500k 2024 boven 2020 (2026-07-14). De 2024-versie is native 100m; de 2020-versie werd van 500m opgerekt. 2020 fit voor stedelijke types iets beter (R² ~+0.01), maar de 2024-bron is beter. Bewuste keuze voor de bron.
  • Groen beperkt tot twee termen (2026-07-17). De 500m-binnenringfracties (stadsgroen, landbouw, overiggroen, natuur-500) kregen negatieve of wisselende tekens bij stedelijke typen: ze meten buurtopbouw, geen groenwaardering. Ze blijven beschikbaar als sensitiviteit maar horen niet in de indicator.

Outputformaat

term;estimate;std_error;t_value;p_value;ci_low;ci_high, met termnamen die direct geldige GeoDMS-itemnamen zijn: lnsize, lnlotsize, nrooms, d_maintgood, d_highrise, bouwperiode_1926_1950 …, trans_year_2012 …, lntt_500k, lntt_ovknoop, uai, constant. Geen parmest-namen als 1.construction_period meer.

Referentieniveaus staan er expliciet in, met coëfficiënt 0 (bouwperiode_va2002 en het eerste sample-jaar). fixest laat basiscategorieën weg, maar de GeoDMS-afnemers zoeken elk kenmerk op met rlookup — een ontbrekende basiscategorie gaf daar een null-coëfficiënt en dus een null-prijs. Dit is het equivalent van Stata's allbaselevels.

Per run komt er ook een Estimates_<tag>_modelinfo.csv bij (n, R², spec, datum).

Volatiliteit (stap 6)

Aparte deliverable voor het Redevelopment-paper: lokale prijsonzekerheid als frictievariabele in een real-options-model.

Werkwijze: hedonisch model per woningtype zonder jaardummies en zonder locatietermen — de nationale trend en het lokale prijsniveau horen juist in het residu. Daarna is index_rt het gemiddelde residu per regio × jaar (minimaal 25 transacties), g_rt de jaar-op-jaar-groei, en vol_r de sd daarvan over minimaal 10 groeijaren.

Drie korrels: gemeente_code (CBS 2024), pc4 en grid5km (5 km RD-cel; vintage-vrij te koppelen aan elke afnemer met coördinaten).

Naast de statische reeks een rolling variant per besluitjaar: Volatility_rolling_<tag>_<korrel>.csv met vol_roll5 (sd over de vijf groeijaren t/m J-1) en g_roll5 (het gemiddelde over hetzelfde venster). Beide zijn per constructie gelagd, dus bruikbaar als tijdvariërende verklaring in een hazard-model. g_roll5 zit erbij omdat zowel onzekerheid als verwachte groei de optiewaarde van wachten verhogen (Capozza & Li) — een volatiliteitscoëfficiënt zonder groei-control is potentieel vertekend.

Validatie

  • 98_validate_cleaning.R — vergelijking van stap 1–2 met de oude geschoonde set (aantallen per jaar/type).
  • 99_validate_vs_stata.R — zelfde input (legacy spatial-CSV 20251024), zelfde spec ⇒ coëfficiënten moeten samenvallen met Estimates_20251024_*.csv. Hiervoor bestaat de legacy-variant van stap 4, die de Stata-compatibiliteit (onbekende hoogte telt als hoogbouw) vastpint.

Clone this wiki locally