-
-
Save ybkamaleri/cd789560d595d7a0d6eb46a23395fc51 to your computer and use it in GitHub Desktop.
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) | |
} |
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:
- Finne hvilke kategorier som mangler (slik du har gjort)
- For hver manglende kategori, opprette en ny linje ved å kopiere en eksisterende linje.
- 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.
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å.
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)
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.
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 atkjoenn
lik2
for alder lik8
i dette tilfelle blir implisitt null? Eller? Som sagt jeg kjenner ikke til hvordanLagKUBE
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).
Hvis du vil se hvordan den ser ut med din test data @jorgenRM kan du kjøre alle linjene i filen check-implicit.R
Her er forslag hvordan vi kan finne implisitt null. Tre argumenter som brukes er :
dt
for datasettetyear
for kolonnenavn som representerer årvar
for kolonnenavn som skal sjekke for implisitt nullHer er eksempel for kolonne
v4
for alder. Hvis man kjøreris_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) som99999999
og VAL1 (her er det v8) som0
ogv4
for alder som8
. 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 iLagKUBE
?