Poject KAFE_01: Kalibratie Algorithme algemeen

Analyse van de FAIRMODE CT6 methode voor PM2.5 fijnstofmetingen

We analyseren in een aantal sessies de voorbeeld fijnstof kalibratie source code, die we ontvingen van het RIVM: sensorFusion_21Jan2021.R en interpolate.R

In deze eerste sessie kijken we naar het overall verhaal;in volgende sessies kijken we naar details

Allereerst wat definitiekwesties:

kalibratie: de nauwkeurigheid (van meetinstrumenten) bepalen aan de hand van een standaard en evt het meetinstrument ijken aan de hand van die standaard

Het huidige algoritme voorziet van een set van de de goedkope fijnstofsensoren ruwe meetresulaten
van een betrouwbaarder waarde, in de wandelgangen ook wel de “gekalibreerde waarde” genoemd.
Strict genomen is dit niet correct, want we laten statistiek los op een hele set en niet op op individuele
sensoren.
Om de verwarring niet groter te maken blijven we we de term “kalibreren” gebruiken in het vervolg, waar
we eigenlijk “groeps correctie” bedoelen.

We kijken naar het huidige algoritme as is, met twee doelen:

  1. transparatie beorderen door begrip
  2. ideeen opdoen voor alternatieve correctie methodes

Gebruikte afkortingen:
CSS = Citizen Science Station
RRS = RIVM Reference Station
NA = Niet Available , er is voor dat moment geen meting.

De CSS meetwaardes
-wijken af van de RRS metingen, (omdat het goedkope sensoren ipv professionele aparatuur betreft)
-wijken af van nabij gelegen CSS van dezelfde fabrikant / andere fabrikant
-hebben afhankelijkheden van externe factoren (bv relatieve vochtigheid)
-hebben mogelijk lange termijn drift

Hoe plak je nu op al die onbetrouwbaarheid iets betrouwbaarders ?
De kern van het algoritme is een niet triviale statische resample methode, genaamd bootstrapping
Het voordeel van deze methode is dat je een schatting kunt maken hoe groot de fout is die je maakt
door met onbetrouwbare meetdata te werken.
Een kleine terzijde is dat in de huidige RIVM interface de berekende kal waardes kunnen worden
opgevraagd, maar niet de bijbehorende statistische onzekerheid.

Elk uur wordt onderstaand algorithme uitgevoerd, waarbij deze interpretatie geheel voor onze
eigen rekening komt, en wellicht nog niet 100% juist is.

Main flow

  1. lees voor alle Nederlandse CSS-sensors de PM2.5 metingen voor dit specifieke uur

    In de rivm operationele praktijk worden alleen sensors van het type SDS011, gekalibreerd.
    (99% van alle in Nedeland aanwezige CSS zijn van het type SDS011)

    In de voorbeeldcode wordt dat type onderscheid niet gemaakt en worden bv ook PMS sensoren meegenomen
    NB hieruit volgt dus dat de voorbeeldcode zelf nu niet draait op de operationele rivm server

    1. Verwijder PM2.5 waardes die groter zijn dan 500 ug/m^3

    2. Als er meerdere metingen op een enkele locatie zijn, neem de gemiddelde waarde ,waarbij
      vooraf NA’s verwijderd zijn

  2. Lees de RRS sensor data van alle RRS in Nederland voor hetzelfde uur

    1. Verwijder PM2.5 waardes kleiner dan 0 (duidt op een RSS error)

    2. Als er meerdere RRS op een enkele locatie staan, neem het gemiddelde en gooi de NA’s weg

  3. Maak voor elke RRS een groep CSS als voldaan is aan de eis dat:
    “er tenminste 2 CSS zijn,binnen een straal van 7.5 km van de RRS.”
    Als er niet voldaan wordt aan die eis, dan krijgt de betreffende RRS geen “CSS-buurgroep”
    en doet niet mee met het kalibreren van de CSS.

    Als er meer dan 10 CSS voldoen, neem dan de 10 CSS die het meest nabijgelegen zijn bij betreffende RRS
    Een enkele CSS kan evt in meerdere RSS groepen zitten.

    We gaan nu verder met die RRS die wel een CSS buurgroep hebben
    RRS die geen CSS buurgroep hebben, komen in de Bootstrap procedure in 7.4 aan bod

  4. Gooi alle rijen met NAs weg van de betreffende uur data, zowel voor CSS als RRS

  5. Outlier analysis : Gooi alle rijen weg uit CSS meetwaardes die buiten de landelijke the 5% and 95%
    percentiles liggen. Hiermee worden voor de kalibratie dus de extreem lage en de extreem
    hoge CSS waardes buiten beschouwing gelaten.

  6. Initialiseer de calibration data frames

    1. Kalibratie factor per RRS sensor met 0

    2. Kalibrated CSS sensor waardes met de ruwe meetwaardes van de sensoren binnen de groep

  7. Doe de Bootstrap procedure een aantal keer (bv 100).

    De Bootstraprocedure heeft als doel om de onzekerheid in de berekende kalibratie te schatten.
    De Bootstraprocedure wordt hieronder apart uitgewerkt

  8. Vanuit de bootstrap procesdure kunneen we door van de herhaalde de sampeling de 5% en 95% grenzen te
    bepalen, een confidence inteval bepalen , zowel voor de RRS calibratie factor , als voor de CSS
    gekalibreerde waardes.

  9. Save RRS calibration factors en calibrated CSS PM2.5 meetdata in csv files

  10. Creeer een plaatje van Nederland met in kleur gecodeerd de calibration factor voor elke RRS

Bootstrap procedure (in een run bv 100 keer uitgevoerd)

7.1. Sample alle CSS data van het betreffende uur (uit stap 5)

7.2. Sample een gedeelte (80%) van de RRS data met teruglegging voor de volgende loop

7.3. For each RRS (met buur-groep) loop door de sensor group:

1. Neem de fijnstof uurwaarde waarde van he RRS als reference value 

2. Kalibreer dusdanig dat het gemiddelde van de metingen binnen de groep gelijk is aan de bijbehorden RRS.
   Deze loop_ bootcalibratiefactor is gelijk aan:  RRSwaarde / (average of the CSS data for this group)

   De aanname is dat er geen offset is tussen het gemiddelde van de CSS groep en het bijbehorende RRS,
   maar alleen een factor !

   Bjvoorbeeld : als de RSS 10 geeft en de gemiddelde bijbehorende CSSgroup 15, dan is de 
   vermenigvuldigingsfactor voor de CSS: 10/15
   NB Er wordt in dit voorbeeld dus niet 5 afgetrokken van de CSS groep

3. Sla de berekende kalibratiefactor per RRS op

7.4. …

7.5. Voor elke CSS in the sample vermenigvuldig de gemeten waarde met een factor die verkregens wordt door gewogen interpolatie van alle nederlandse RRS uur waardes met de kalibratiefactor uit 7.3.2.
De weging is zo dat de correctie afneemt met de afstand, dwz hoe verder de CSS af ligt van de RRS hoe minder de relatieve invloed van de RRS op de CSS kalibratiecorrectie is.

In grote lijnen de formule om de uurcorrectiefactor voor een CSS te berekenen

 Een CSSi heeft vaste afstand Dij tot een RRSj
 Voor elk uur 
         heeft RRSj een korrectie factor Rj
         heeft een CSSi een PM25 meetwaarde PM25ruw 
         dan wordt de Correctiefactor voor CSSi een op afstand Dij gewogen som van een functie op de RCj
         en is de gekalibreerde fijnstof PM25 waarde CSSi = PM25ruw * CNi 

De weging met afstand Dij vindt plaats met de IDW formule, zie bv:

Al met al een ingewikkelde procedure, statistisch verantwoord, maar het is mij niet helemaal
duidelijk hoe de vertaling te maken naar de fysica.

De functie formule in de code bevat een aantal parameters. Aan elke van die parameters kun je draaien.
Een volgende keer kijken we steeksproefgewijs wat het effect daarvan is op het eind resultaat.

Intussen denken we of we een eenvoudiger model kunnen bedenken.

Walter - mooie en inspirerende tekst!

Kalibratie, of groepscorrectie, zoals hier beschreven roept wel een paar vragen op.
De eerste vraag is wat de natuurkunde achter deze correctie is - wat is de fout in de metingen?
De RIVM stations meten met behulp van beta-absorptie op een filter of via een oscillerende microbalans methode (ook weer met een filter). Wij missen de informatie wat de foutenbronnen kunnen zijn, maar bij het doorkijken van de files van RIVM stations kom je af en toe negatieve waarden tegen. Omdat beide RIVM meetmethodes in principe differentiële methodes zijn: meten van een grootheid (bijv absorptie omgerekend naar dichtheid) voordat het filter vervuild raakt en dat aftrekken van diezelfde grootheid nadat het filter vervuild raakt is de foutdistributie de convolutie van de twee foutdistributies, en kan de fout een negatieve waarde opleveren - en inderdaad zie je af en toe negatieve waarden opduiken in de RIVM metingen. Distributie van de fout van RIVM metingen misschien wel constant (onafhankelijk van deeltjesdichtheid) als additief bij de “echte” waarde.
De SDS011’s en Sensirions zijn deeltjestellers. Misschien wat naïef, maar dan kun je een Poisson distributie veronderstellen - fout evenredig met de wortel van het aantal gemeten deeltjes. Er zijn misschien nog wat additionele foutenbronnen, die de distributie veranderen, maar in principe verwacht je een hogere precisie bij een kleiner aantal deeltjes - bij een lagere concentratie.

Als je een groepscorrectie wilt uitvoeren zul je rekening moeten houden met de distributie van fouten. De aanname van dat de deeltjestellers en de RIVM sensoren bij 0 vervuiling allebei de waarde 0 geven is natuurlijk dubieus. Het rekening houden met verschillende distributies (afhankelijk van type meetapparaat en type CS sensor, en afhankelijk van deeltjes intensiteit) en het accepteren van een bias in de meetresultaten maakt het een interessant probleem. Ik heb mijn eerstejaars teksten over regressies en gewogen gemiddelden niet meer, maar we kunnen vast wel de distributies die we vinden met de bootstrap procedure gebruiken om een schatting van de distributie te maken.

De volgende vraag is: waar komen eventuele systematische fouten vandaan en kunnen we die afschatten. Zijn de systemen lineair, wat is de rol van luchtvochtigheid. Vooral voor de SDS011 is dit laatste relevant.

Daarop volgend - is het logisch dat de correctiefactoren zo snel veranderen? Wat is de invloed van wind - wij weten dat fijnstof verontreiniging als wolken over het land trekken.

De R-code zoals beschikbaar is, is voor mij niet helemaal duidelijk. Ik begrijp dat er per RIVM een kalibratiefactor wordt berekend - maar waarom hebben we dan een bootstrap procedure nodig?
Eerstvolgende stap is in elk geval de R code in leesbare pseudocode om te zetten.

Vragen genoeg.
Ik ben benieuwd naar KAFE_02 en volgende…
Frans

Groepscorrectie (met dank aan Joost) is een interessante ontwikkeling. In mijn eerstejaars statistiek vind ik helaas te weinig over de recente lasso techniek :slight_smile: . Lasso techniek zit dacht ik standaard in de Python math lib. Mi is de groepscorrectie methode veelbelovend. Maar helpt alleen bij grotere aantallen in de buurt bivakkerende meetkits :-(.

Rol van luchtvochtigheid: ca 4 jaar geleden hebben Joost (regio Utrecht, stedelijk), Dieter (regio Berghaven, zeewind) en mijzelf (regio Limburg, droog/weinig wind) gerapporteerd op een Samen Meten bijeenkomst van wat bevindingen tav invloed van RH en temperatuur op de fijnstof metingen (met name PM2.5). Conclusies waren: logarithmisch correctie, lokaal afhankelijke parameters, overschatting bij hogere waarden, onderschatting bij lagere waarden. Niet simpel lineair dus. Meer metingen over langere periode was nodig. Dit was aanleiding voor ons om alle meetkits te voorzien van temperatuur en luchtvochtigheidssensoren (vroeger een Bosch nu een Sensirion sensor) en om van elk type fijnstofsensoren er een meetkit bij het RIVM station te zetten. . Een grote hoeveelheid metingen zijn er nu zowel bij RIVM als elders. Vergeet de lokatie afhankelijkheid niet van de correctie factoren niet … Nu nog tijd van leven vinden.

Invloed van wind: het plan (alles is er klaar voor) is met een drone met om de 50 meter te gaan meten. Ivm de oorlogssituatie kunnen we momenteel niet hoger als 120 meter … Ik weet dat een groep studenten van Uni Nijmegen een jaar geleden met een ballon wat verkennend onderzoekje gedaan hebben. Helaas zijn dit maar kleinschalige en eenmalige steekproefjes. Echte resultaten ontbreken mi. Doet iemand regelmatig aan zweefvliegen?