Skip to content

Instantly share code, notes, and snippets.

@ybkamaleri
Last active September 28, 2021 16:02
Show Gist options
  • Save ybkamaleri/cd789560d595d7a0d6eb46a23395fc51 to your computer and use it in GitHub Desktop.
Save ybkamaleri/cd789560d595d7a0d6eb46a23395fc51 to your computer and use it in GitHub Desktop.
Implicit NULL
if(!requireNamespace("devtools")) install.packages("devtools")
devtools::install_github("helseprofil/orgdata")
devtools::source_gist("cd789560d595d7a0d6eb46a23395fc51", filename = "stata-data.R")
data <- stata_data()
dt <- orgdata::do_implicit_null(data)
dt
if(!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load("data.table", "haven")
is_implicit_null <- function(dt, year, var){
var <- as.character(deparse(substitute(var)))
year <- as.character(deparse(substitute(year)))
ref <- sort(unique(dt[[var]]))
aar <- unique(dt[[year]])
nn <- vector(mode = "list", length = length(aar))
for (i in seq_along(aar)){
yr <- aar[i]
dd <- setdiff(ref, unique(dt[[var]][dt[[year]] == yr]))
## print(dd)
nn[[i]] <- dd
names(nn)[i] <- as.character(yr)
}
return(nn)
}
path <-"F:/Forskningsprosjekter/PDB 2455 - Helseprofiler og til_/PRODUKSJON/DEVELOP/Rawdata_implesitteNuller"
dt <- read_dta(file.path(path, "Dode_2016_2017.dta"))
setDT(dt)
dt
is_implicit_null(dt, aar, v4)
if(!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load("data.table", "haven")
stata_data <- function(){
path <-"F:/Forskningsprosjekter/PDB 2455 - Helseprofiler og til_/PRODUKSJON/DEVELOP/Rawdata_implesitteNuller"
dt <- haven::read_dta(file.path(path, "Dode_2016_2017.dta"))
data.table::setDT(dt)
dt[, GEO := paste0(v1, v2)]
dt[, AAR := aar]
dt[, c("v1", "v2", "aar", "v9") := NULL][]
invisible(dt)
}
@ybkamaleri
Copy link
Author

ybkamaleri commented Sep 20, 2021

Her er forslag hvordan vi kan finne implisitt null. Tre argumenter som brukes er :

  • dt for datasettet
  • year for kolonnenavn som representerer år
  • var for kolonnenavn som skal sjekke for implisitt null

Her er eksempel for kolonne v4 for alder. Hvis man kjører is_implicit_null(dt, aar, v4) ser man at for 2016 så mangler det alder for 8, 108, og 112, og for 2017 er alder lik 109 som mangler. Tanken er å legge disse 4 implisitte nulle for grunnkrets med GEO (her blir det kolonne v1 og v2) som 99999999 og VAL1 (her er det v8) som 0 og v4 for alder som 8. Det er greit nok, men hva skal de andre kolonne være dvs. v3, v5, v6 og v7? Funker det med totalen av hver av disse kolonnene?

Siden datasettet er en aggregert data, så må det vel være at alle har de kategoriene også. For eksempel for implisitt null for alder lik 8, så blir det ikke bare en rad, men flere rader av alle kategorier for v3, v5, v6 og v7. Forstår jeg da riktig eller skal disse behandles i LagKUBE?

@ybkamaleri
Copy link
Author

Kommentar fra Jørgen:

I eksempelet ditt kan kolonne v3, v5, v6 og v7 ta tilfeldige verdier, men det bør nok være gyldige verdier. Eksempel: v3 (kjønn) må være "1" eller "2", men det har ingen betydning hvilken av disse verdiene det blir.

Metoden min for å sikre at v3, v5, v6 og v7 får tilfeldige (men gyldige) verdier var slik:

  1. Finne hvilke kategorier som mangler (slik du har gjort)
  2. For hver manglende kategori, opprette en ny linje ved å kopiere en eksisterende linje.
  3. I den nye linjen;
    a. endre kolonne v1 og v2 til 99999999 og VAL1 (her er det v8) til 0 og v4 for alder til 8.
    b. Kolonne v3, v5, v6 og v7 beholdes slik de er.

@ybkamaleri
Copy link
Author

ybkamaleri commented Sep 20, 2021

OK. Det betyr at kolonne v3, v5, og v7 kan bare bruke hva som helst verdi i den kolonne? For eksempel som denne tabellen

GEO AAR kjoenn alder v5 v6 v7 VAL1
99999999 2016 1 8 1B 1 1 0
99999999 2016 1 108 1B 1 1 0
99999999 2016 1 112 1B 1 1 0
99999999 2017 1 109 1B 1 1 0

Dette resulterer vel at kjoenn lik 2 for alder lik 8 i dette tilfelle blir implisitt null? Eller? Som sagt jeg kjenner ikke til hvordan LagKUBE håndterer aggregeringen.

Evt. kan selvsagt legge totalen i stedenfor tilfeldig kategori, men da må vi ha totalen for kjønn og alder også.

@hanhel
Copy link

hanhel commented Sep 21, 2021

Hva hvis det er ett årstall som mangler i alle årganger?

dt_u109 <- dt %>% filter(v4 != 109)

is_implicit_null(setDT(dt_u109), aar, v4)

@ybkamaleri
Copy link
Author

ybkamaleri commented Sep 21, 2021

Referansen er at kategorien finnes i minst et årgang i denne koden på linje 7

ref <- sort(unique(dt[[var]]))

Hvis det ikke eksisterer i alle årganger så blir det ikke betraktet som implisitt null, men bare en kategori som ikke eksisterte og skal ikke gjøre noe med.

@jorgenRM
Copy link

OK. Det betyr at kolonne v3, v5, og v7 kan bare bruke hva som helst verdi i den kolonne? For eksempel som denne tabellen

GEO AAR kjoenn alder v5 v6 v7 VAL1
99999999 2016 1 8 1B 1 1 0
99999999 2016 1 108 1B 1 1 0
99999999 2016 1 112 1B 1 1 0
99999999 2017 1 109 1B 1 1 0
Dette resulterer vel at kjoenn lik 2 for alder lik 8 i dette tilfelle blir implisitt null? Eller? Som sagt jeg kjenner ikke til hvordan LagKUBE håndterer aggregeringen.

Evt. kan selvsagt legge totalen i stedenfor tilfeldig kategori, men da må vi ha totalen for kjønn og alder også.

Dette ser helt fint ut! I kolonne v3, v5, og v7 kan du bruke hva som helst i de nye linjene (så lenge det er innenfor de verdiene som til vanlig forekommer i v3, v5, og v7).

Det stemmer at kjonn=2 for alder=8 blir en implisitt null men dette blir rektangularisert senere i løypa (fordi det finnes andre tilfeller av kjonn=2 i 2016 og du har lagt inn et tilfelle av alder=8 i 2016 ).

Orgadata er forresten FULL av implisitte nuller, men 99.99 % blir håndtert i R-løypa (ved rektangularisering). "Bug'en" i R-løypa er at den bare rektangulariserer INNENFOR ÅRGANGER. Dermed glipper det når alder=8 er helt fraværende i en årgang (2016).

@ybkamaleri
Copy link
Author

ybkamaleri commented Sep 28, 2021

Hvis du vil se hvordan den ser ut med din test data @jorgenRM kan du kjøre alle linjene i filen check-implicit.R

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment