library(dplyr)
library(magrittr)

Méthode

Le calcul consiste à estimer la part "brute" de chaque composant (taux, ghs, autres montants variables, autres montants fixes), déterminer la proportion de leur participation à l'évolution de la valorisation puis de répartir ceci en euros.

Les calculs sont les suivants :

La base à expliquer est le montant total assurance maladie (variable mnt_tot_am).

La diffculté est d'expliquer la part variable. $evol_mnt_tot_variable = evol_mnt_tot_am - evol_mnt_constants$

On calcule la proportion de chacune des parts variables (taux, ghs et montants variables).

La valeur d'évolution de chacun sera la proportion sur la part variable.

Ceci est vrai pour les séjours réels. Il faut en plus ajouter les apparition ou disparition, à savoir pour les envois qui sont les premiers ou les obs virtuelles créés pour les disparitions. Ceci sera dans Effet création/suppression (incluant les ej/eg).

db <- readRDS('../produced_data/21-vvs_2017_minimal_anonyme.rds')

Ajouter colonnes :

Faire les calculs.

Remplacer tous les NA par des 0

na_to_0 <- function(col) {
  db[is.na(db[,col]),col] <<- 0
}

na_to_0('mnt_br')
na_to_0('mnt_variables')
na_to_0('mnt_constants')
na_to_0('mnt_tot_am')

Ajout des m-1

Ajout des valeurs à M-1

db %<>%
  arrange(ida, mois_envoi) %>%
  group_by(ida) %>%
  mutate(
    taux_prev = c(0, taux[seq_len(n()-1)]),
    mnt_br_prev =  c(0, mnt_br[seq_len(n()-1)]),
    mnt_variables_prev = c(0, mnt_variables[seq_len(n()-1)])
  ) %>%
  ungroup

Vérifier

db %>% 
    filter(ida %in% sample(x = unique(db$ida), size = 3)) %>%
    select(ida, mois_sortie, mois_envoi, taux, taux_prev, mnt_br, mnt_br_prev) %>%
    knitr::kable()

Ajout des mnt tot variables

db %<>%
  mutate(mnt_tot_variables = mnt_tot_am - mnt_constants)

calculer les evolution des montants

Calcul central !!!

db$mnt_tot_am[is.na(db$mnt_tot_am)] <- 0

db %<>%
  arrange(ida, mois_envoi) %>%
  group_by(ida) %>%
  mutate(
    evol_mnt_tot = mnt_tot_am - c(0, mnt_tot_am[seq_len(n()-1)]),
    evol_mnt_mo = mnt_mon - c(0, mnt_mon[seq_len(n()-1)]),
    evol_mnt_dmi = mnt_dmi - c(0, mnt_dmi[seq_len(n()-1)]),
    evol_mnt_tot_variables = mnt_tot_variables - c(0, mnt_tot_variables[seq_len(n()-1)]),
    evol_mnt_po = mnt_po - c(0, mnt_po[seq_len(n()-1)]),
    evol_mnt_fj = (mnt_18 + mnt_fj2) - c(0, mnt_18[seq_len(n()-1)] + mnt_fj2[seq_len(n()-1)]),
    evol_ghsminam = ghsminam - c(0, ghsminam[seq_len(n()-1)]),
    evol_mnt_med_atu = mnt_med_atu - c(0, mnt_med_atu[seq_len(n()-1)]),
    evol_mnt_scd = mnt_scd - c(0, mnt_scd[seq_len(n()-1)]),
    evol_mnt_constants = mnt_constants - c(0, mnt_constants[seq_len(n()-1)])
    ) %>%
  ungroup

Calcul des effets bruts

db %<>%
  mutate(
    # Effet brut du GHS : effet à taux constant
    eb_ghs = taux * mnt_br - taux * mnt_br_prev,
    eb_mnt_variables = taux * mnt_variables - taux * mnt_variables_prev,
    eb_taux = taux * (mnt_br + mnt_variables) - taux_prev * (mnt_br + mnt_variables)
  )

# Remplacer les NA par des 0
na_to_0('eb_ghs')
na_to_0('eb_mnt_variables')
na_to_0('eb_taux')

Calcul des effets

ec = effet calculé

db %<>%
  mutate(
    # Somme des effets bruts
    eb_sum = eb_ghs + eb_mnt_variables + eb_taux,
    # Effets calculés de chaque
    ec_ghs = eb_ghs / eb_sum * evol_mnt_tot_variables,
    ec_mnt_variables = eb_mnt_variables / eb_sum * evol_mnt_tot_variables,
    ec_taux = eb_taux / eb_sum * evol_mnt_tot_variables
  )

na_to_0('eb_sum')
na_to_0('ec_ghs')
na_to_0('ec_mnt_variables')
na_to_0('ec_taux')

db$ec_autre <- rowSums(select(db, ec_mnt_variables, evol_mnt_constants), na.rm = TRUE)

Il y a des patients qui perdent remboursement assurance maladie.

Système ATT hosp : patients en attente de droit.

perte_droit <-db %>%
  filter(is.na(taux), taux_prev > 0, ! obs_virtuelle)

table(perte_droit$taux_prev)
table(perte_droit$mois_sortie)
summary(perte_droit$mnt_tot_am)

Peut être des cas où la valo passe en AME ou ATU

Verif

En théorie les sommes des effets calculés (ec) devraient être égales à la valeur de l'évolution du montant totaux.

db$diffec <- rowSums(select(db, ec_ghs, ec_autre, ec_taux)) - db$evol_mnt_tot
summary(db$diffec)

sum(abs(db$diffec) > 1 & !db$obs_virtuelle)
db_diff <- filter(db, abs(diffec) > 1 & !db$obs_virtuelle & !db$premiere_valo)


table(db_diff$valo)

Cas qui posent problèmes

summary(db)

Sauvegarde

saveRDS(db, file = "../produced_data/30-calcul_evol.rds")


jomuller/vvs documentation built on May 21, 2019, 2:05 p.m.