KHELSE function

Innhold

Gjennomgang av funksjoner brukes i KHELSE funksjon. Funksjonene som presenteres her er tilnærmet rekkefølgen de blir kalles inn. Funksjoner som har blitt sjekket har tags ##FUN01 etc.

1. SettDefDesignKH

En del av globs. Henter parametre fra tabell KH_DELER. Lager variabler med TYPE = INT med extention *.l og *.h for evt. lavest og høyest verdi. Lager en list objekt som følgende:

  list(DelKols=DelKols, #uten deling FYLKE og GEO i GEOniv
       DelKolsF=DelKolsF, #med deling for FYLKE og GEO
       KolsDel=KolsDel, # motsatte av DelKols
       DelKolN=DelKolN, #kolonne DelKol med attribute fra DEL
       DelType=DelType, #kolonne TYPE med attribute fra DEL
       DelFormat=DelFormat, #kolonne FORMAT med attribute fra DEL
       UBeting=UBeting,
       BetingOmk=BetingOmk,
       BetingF=BetingF,
       OmkDel=OmkDel,
       DesignKols=DesignKols, #Kolonne uten TABS
       DesignKolsF=DesignKolsF, #Kolonne med TABS
       DesignKolsFA=DesignKolsFA, #Alle kolonne inkludert FYLKE og GEO
       AggPri=AggPri, #ordered DEL ift. AGGREGERPRI
       AggVedStand=AggVedStand, #velger only A og K
       IntervallHull=IntervallHull,
       AMissAllow=TRUE)

2. LagFilgruppe

Hovedfunksjon for å lese raw data og slå sammen dataene til en RDS fil.

2.1. Argumenter

  • gruppe :
  • batchdate : fra SettKHBatchDate()
  • globs : from FinnGlobs()
  • diagnose = 0
  • printR = TRUE
  • printCSV = FALSE
  • printSTATA = FALSE
  • versjonert = FALSE
  • dumps = list()

2.2. Prosess

Beskrivelse av prosessene:

  • FinnfilgruppeParametre() lager FGP object
  • FinnFilBeskGruppe() lager filbesk object
  • Loop alle rader i filbesk og lager følgende:
    • filn som er absolutt path til filen
    • AAR hvis det ikke er spesifisert eller skrevet som <$y> skal value hentes fra DEFAAR i ORIGINALFILER tabell

2.3. Output

3. FinnFilgruppeParametre

Setter inn parameter til en filgruppenavn. Access tabell FILGRUPPER brukes i denne funksjonen. Denne produserer object FGP til viderebruk.

3.1. Argumenter

  • gruppe : Filgruppenavn
  • batch : fra SettKHBatchDate(). Denne lager dagens dato til format «%Y-%m-%d-%H-%M»
  • globs : fra FinnGlobs() function.

3.2. Output

En tabell av type list hentet fra tabell FILGRUPPER. I tillegg legges det 3 til dvs. vals, amin og amax. De to siste er for alder minimum og maksium hentet fra kolonne ALDER_ALLE. List vals i tillegg inneholder 3 tillegg lister $vals$verdi_i_VAL1navn, $vals$verdi_i_VAL1navn$miss og $vals$verdi_i_VAL1navn$miss. Det samme for VAL2 og VAL3. F.eks for filgruppe ARBEIDSLEDIGE så blir det:

  $vals
  $vals$ARBEIDSLEDIGE
  $vals$ARBEIDSLEDIGE$miss
  [1] "0"

  $vals$ARBEIDSLEDIGE$sumbar
  [1] "1"

3.3. Kommentar

  • Sjekk aktiv filgruppenavn basert på tidsperiode dvs. VERSJONFRA og VERSJONTIL i Access tabell, men denne informasjon er ikke brukes eller oppdateres. Object FGPaktiv.
  • Sjekk hvis det er duplikater filgruppenavn. Denne er unødvendig hvis kolonne FILGRUPPE er nøkkel eller unik i Access tabell.
  • Object amax for maksimal aldre hentes fra Access tabel HOVEDPARAMETREg, men der er det bare en linje som lager default for maks alder. Kan dette gjøres annen sted eller er dette egentlig en ubrukt tabell?

4. FinnFilBeskGruppe

Henter filnavn og path gjennom informasjon i Access tabell ORIGINALFILER, INNLESING og ORGINNLESkobl. Denne funksjonen produserer object delfiler til viderebruk.

4.1. Argumenter

  • gruppe : filgruppenavn
  • batchdate = NULL
  • globs : fra FinnGlobs()

SQL spesifikasjonen som brukes:

     sqlt<-paste("SELECT KOBLID, ORIGINALFILER.FILID AS FILID, FILNAVN, FORMAT, DEFAAR, INNLESING.*
                 FROM INNLESING INNER JOIN
                 (  ORGINNLESkobl INNER JOIN ORIGINALFILER
                 ON ORGINNLESkobl.FILID = ORIGINALFILER.FILID)
                 ON   (INNLESING.DELID = ORGINNLESkobl.DELID)
                 AND (INNLESING.FILGRUPPE = ORGINNLESkobl.FILGRUPPE)
                 WHERE INNLESING.FILGRUPPE='",filgruppe,"'
                 AND ORIGINALFILER.IBRUKFRA<=",datef,"
                 AND ORIGINALFILER.IBRUKTIL>", datef,"
                 AND INNLESING.VERSJONFRA<=",datef,"
                 AND INNLESING.VERSJONTIL>",datef,sep="")

Disse variabler er laget av denne funksjonen:

  > names(fb)
   [1] "KOBLID"      "FILID"       "FILNAVN"     "FORMAT"      "DEFAAR"
   [6] "ID"          "FILGRUPPE"   "DELID"       "BRUK"        "VERSJONFRA"
  [11] "VERSJONTIL"  "FORMATgml"   "INNLESARG"   "MANHEADER"   "MULTIHEAD"
  [16] "KASTKOLS"    "UNDERTABLOK" "FYLLTAB"     "RESHAPEid"   "RESHAPEmeas"
  [21] "RESHAPEvar"  "RESHAPEval"  "AGGERGER_DF" "RSYNT1"      "RSYNT2"
  [26] "FEILRAPPORT" "GEO"         "GEOd2"       "GRUNNKRETS"  "TKNR"
  [31] "SONER"       "AAR"         "KJONN"       "ALDER"       "UTDANN"
  [36] "SIVST"       "LANDBAK"     "TAB1"        "TAB2"        "TAB3"
  [41] "VAL1"        "VAL2"        "VAL3"        "ALDERkb"     "KJONNkb"
  [46] "TAB1kb"      "TAB2kb"      "TAB3kb"      "KOMMENTAR"   "RAPPORT2"
  [51] "TID"         "PROSESSDATO" "SKALA_VAL1"  "SKALA_VAL2"  "SKALA_VAL3"

4.2. Output

5. LagTabellFraFil

5.1. Argumenter

  • filbesk : Object fra FinnFilBeskGruppe() function
  • FGP : Object fra FinnFilgruppeParametre() function
  • diagnose = diagnose
  • globs = globs
  • versjonert = versjonert
  • dumps = dumps

5.2. Output

5.3. TODO Kommentar [0/0]

  • [ ] Hva skal kolonne FYLLTAB brukkes til?
  • [ ] Hvor finner man kolonner RESHAPEpre og RESHAPEpost?
  • [ ] Hva er GEOd2?

6. LesFil

Innkalt under LagTabellFraFil() function

6.1. Argumenter

  • filbesk
  • batchdate = batcdate
  • globs = globs
  • dumps = dumps

6.2. Output

7. FinnFilGruppeFraKoblid

Valg filgruppenavn i kolonne FILGRUPPE som match filbesk$KOBLID fra tabell ORGINNLESkobl. Innkalles under LesFil() i sqlQuery for INSERT i SQL kode med argument filbesk$KOBLID.

7.1. Argumenter

  • koblid : verdi fra object filbesk$KOBLID
  • globs : fra function FinnGlobs()

7.2. Output

En vector av den filgruppenavn til den spesifisert KOBLID eg. UFORE.

8. TilFilLogg

OBS!: Denne funksjonen ender opp med CRASH nokså ofte! Innkalles under LesFil() for å leser Access tabell INNLES_LOGG basert på KOBLID og objekt batchdate.

8.1. Argumenter

  • koblid :
  • felt :
  • verdi :
  • batchdate : from SettKHBatchDate() function
  • globs : fra FinnGlobs()

Query som brukes bl.a

  sqlQuery(globs$log,paste("DELETE * FROM INNLES_LOGG WHERE KOBLID=",koblid,"AND SV='S'",sep=""))

  upd<-paste("INSERT INTO INNLES_LOGG ( KOBLID, BATCH, SV, FILGRUPPE ) SELECT=",koblid,",'",batchdate,"', 'S',",FinnFilGruppeFraKoblid(koblid),sep="")
      sqlQuery(globs$log,upd)

  upd<-paste("UPDATE INNLES_LOGG SET ",felt,"=",verdi," WHERE KOBLID=",koblid," AND SV='S' AND BATCH='",batchdate,"'",sep="")

8.2. Output:

Legger til ny rad i INNLES_LOGG tabell via INSERT eller oppdatere tabellen via UPDATE.

9. KHCsvread

Leser inn CSV filer ved bruk read.csv eller data.table::fread.

9.1. Argumenter

  • filn : Absolutt sti til filen
  • header = FALSE
  • skip = 0
  • calClasses = «character»
  • sep = «;»
  • quote = «\»« obs! denne bør være ‘\»’
  • dec = «.»
  • fill = FALSE
  • encoding = «unknown»
  • blank.lines.skip = FALSE
  • na.strings = c(«NA»)
  • brukfread = TRUE

9.2. Output

En csv fil med header=FALSE dvs. header i tabellen blir til en ny kolonne. Hvorfor??

9.3. Kommentar

Koden for å lese csv med fread som produserer data.frame kan skrives slik:

  fread(DT, data.table = FALSE)

10. cSVmod

Restrukturerer dataene ved bruk parametrer fra INNLESING tabell.

10.1. Argumenter

  • DF : data.frame i CSV format fra KHCsvread eller XLS
  • filbesk :
  • header = TRUE
  • skip = 0 Hvilke rader som skal uttelates ved lesing
  • slettRader = integer(0) obs! her bør det være 0L. Denne skal velger rader som skal slettes.
  • sisteRad = 1 Velges hvilken som er siste rader
  • TomRadSlutt = FALSE Velge hvilken rader som er tommer og subsett data.frame fra rad 1 til raden som den tomme raden.
  • FjernTommeRader = FALSE Slett tomme rader i hele data.frame
  • FjernTommeKol = TRUE Slett tomme kolonne
  • globs = FinnGlobs()

10.2. Output

10.3. Kommentar

Flere argumenter som egentlig gjør nesten det samme oppgavene. Alternativ å finne tomme rader eller kolonne kan brukes apply og er nok raskere.

    rnames <- rownames(DF[apply(is.na(DF) | DF == "", 1, all), ]) #for rader
    knames <- rownames(DF[apply(is.na(DF) | DF == "", 2, all), ]) #for kolonner

    which(rownames(DF) %in% tnames)

10.4. Forbedring

  • Finne ut i INNLESSING tabell hvor mange som har FjernTommeRader og FjernTommeKol. Sjekk

hvordan filen ser ut og tilpasse deretter før ny database lages.

11. Generell spørsmål

Alle type spørsmål som trenger oppklaring:

11.1. Variable med *.l og *.h extention

Alle år og aldre er ALLTID intervaller i hele systemet. Dermed brukes alltid AARl/AARh og ALDERl/ALDERh. Dette gjelder selv om det bare dreire seg om enkelte kalenderår (AARl=2020, AARh=2020) eller enkle aldersår (ALDERl=30,ALDERh=30).

11.2. Hva er val.f og val.a, og hvordan den brukes?

val.a og val.f er to flagg som alltid går hånd i hånd med hver verdikolonne. Detaljene kan våre ganske kompliserte, men i hovedtrekk:

val.a teller opp hvor mange originaltall som har vårt brukt til å lage verdien. Eksempler: Når to kommuner slås sammen for kommuneharmonisering blir det typisk val.a=2. Når tall for 5 enkeltaldre slås sammen til en 5 års aldersgruppe blir det val.a=5. De to tilfellen i kombinasjon gir val.a=10

val.f er strengt tatt viktigere. Den angir i hovedtrekk hvorfor tall er NA. Er det fordi tallet mangler originalt, er det fordi det ikke lar seg bergene, er det fordi det anonymisres osv.

Men begge val.a og val.f får statis ferdi henholdsvis 0 og 1. Se koden.

  valok<-1
  valf<-paste(val,".f",sep="")
  vala<-paste(val,".a",sep="")
  valomk<-paste(val,"omk",sep="")

  ##Lag omkodet verdi med numerisk. Ikke numerisk blir foreløpig NA
  suppressWarnings(DF[,valomk]<-as.numeric(valKB$omk))
  DF[,valf]<-0
  DF[,vala]<-1
  DF[valKB$omk==".." & DF[,val]!=valKB$omk,valf]<-1
  DF[valKB$omk=="." & DF[,val]!=valKB$omk,valf]<-2
  DF[valKB$omk==":" & DF[,val]!=valKB$omk,valf]<-3

11.3. Hva kolonne TYP brukes til i GeoKoder tabell? Verdien er O og U.

TYP=0 er de Ordinåre geokodene, TYP=U er geokoder som angir «Uoppgitt» (slik som at 1199 er uopgitt kommune under fylket 11). Dette filteret brukes når det produseres kuber og Firksvik-data, da blir det ikke rapportert tall for U-koder, men disse må våre med fram til da fordi de inngår i summer som lager totaler for høyere geografisk nivå (1199 tall inngår i 11 osv).

11.4. I Access tabell FILGRUPPER for kolonne ALDER_ALLE som har ingen data

Noen ganger skreves det som NA eller 25_. Når det er NA så plukket verdier fra default ie. min og maks alder. Når det er bare 25_ så legges maks alder fra tabell ..

12. Access related spørsmål

Dette er spørsmål spesifisert til kolonnebruk i Access tabeller.

12.1. FILGRUPPER tabell

  • Hva kolonne FILTER1, FILTER2 og FILTER3 brukes til? Verdien er 1.
  • Kolonne ALDER_ALLE har forskjellige verdier bl.a 0_120, 1_6, 25_ og ingen verdi? Når ingen verdi blir det satt 0_120 som min og maks alder. Når det skreves bare 25_ skal det får 25 som min alder og 120 som maks alder.

13. SPVflagg

Disse gjelder når dataene er kjørt i LagKUBE. Notat er fra Steinar.

Kode i data Tegn i KH/NH tabell Tekst i fotnote Tekst i SSB Statbank fotnote
0 ingen    
1 .. Manglende data Tallgrunnlag mangler dvs. tall er ikke kommet inn i våre databaser eller er for usikre til å publiseres
2 . Lar seg ikke beregne Ikke mulig å oppgi tall dvs. tall finnes ikke på dette tidspunktet fordi kategorien ikke var i bruk da tallene ble samlet inn
3 : Anonymisert Vises ikke av konfidensialitetshensyn dvs. tall publiseres ikke for å unngå å identifisere personer eller virksomheter

Kodene settes i gamleløypa (KHfunctions.R, i kubeproduksjonstrinnet) i variabler med navn <måtall>.f . Det er flere koder i bruk inne i databehandlingen, fordi ulike årsaker til at det mangler tall må behandles ulikt ved aggregering, prikking og skjuling. Helt til slutt i LagKUBE oversettes de interne kodene til en av de tre vist ovenfor.

Den koden som kommer ut i kuben, ser ikke alltid logisk ut. I flere tilfeller har vi skrevet postprosesseringsscript som har «ryddet opp» i kodene, når vi vet at det er spesielle årsaker til at større grupper i dataene (for eksempel bydelene i noen byer) har manglende tall.

14. Spesialvariabler i R

..a Antall rader tallet stammer fra (Kommunesammenslåinger!, M+K -> Kjønn samlet, o.l.)
..f Flagg, blir til SPVflagg etter et sett regler. Det er ett slikt flagg for hver tallvariabel, men de samles til en verdi i SPVflagg. Reglene er bl.a. :
  - Verdier 1-2-3 blir til det samme i SPVflagg. Kan altså sette disse direkte, hvis de skal rettes.
  - Verdier -1 og 4 blir til SPVflagg=3, verdi 9 blir til =1.
  + Verdi 4 betyr «Naboprikket», og utløser ikke skjuling av serier.
  - Verdi 8: Dukket opp i Skjenketidsslutt og Skjenkesteder for kommuner med tom celle i inndata. Har ikke klart å finne ut hva kodene betyr, og Kåre husker ikke/har ikke tid til å grave det fram - det var en komplisert hack for å håndtere ubalanse i Sysvak.
  + Håndtert ved å legge følgende i KODEBOK for aktuell innlesingsspec: Tom celle i VAL1 kodes til «..» (uten gåseøyne).
  - Hvis verdien skal korrigeres til et høyere tall i min RSYNT, holder det å endre i en av de måltallkolonnene som skal leveres ut (da bruker systemet den høyeste verdien for alle ut-kolonner). Men hvis jeg skal korrigere nedover, f.eks. til SPVflagg==1, må jeg behandle alle ut-kolonnene. DET ER TRYGGEST å ta alle, uansett …
  - Erfaring: Reglene virker bare skikkelig når filen bruker standardvariablene. Se nedenfor.*
..n Antall årganger tallet stammer fra (f.eks. ved glidende snitt)
MALTALL Er en intern resultatkolonne, som kopieres til riktig ut-kolonne. På stadiet «RSYNT_POSTPROSESS» er den ferdig brukt og overflødig, den dør like etter.
STANDARD Dersom standardkolonnene fins, er det de som blir levert ut. Teller, Rate, Meis og SMR.
ANDRE Sjekk i FILFILTRE. Der kan det være spesifisert mellomregninger etc. (Eks. : Vaksgrad (i Sysvak) - stå som navn på VAL1 i innlesingen, er faktisk levert vaks.dekning, men brukes i beregning av Teller spesifisert i FILFILTRE.)

Flagg når det er spesielle variabelnavn: Overfør rettinger til et av standardflaggene!

«Vedvarende lavinntekt NH» brukte ingen av de standard tallvariablene som har en tilhørende _f-variabel (teller, nevner, rate), og dermed var heller ingen av standard _f -variablene i bruk (alt var missing i disse). Det fantes et måltall LAVINNT_VEDV, med tilhørende LAVINNT_VEDV_f , men da fungerte ikke produksjon av SPVflagg i henhold til denne flaggvariabelen. SPVflagg ble feil, og retting i LAVINNT..._f i en Rsynt-Postprosess virket ikke.

Jeg satte replace RATE_f = LAVINNT_VEDV_f til slutt i en Rsynt-Postprosess, og da slo endringene inn i SPVflagg.