library(dplyr)
library(magrittr)
db <- readRDS('../produced_data/10-vvs_2017_clean.rds')

Contexte

En théorie un envois de RSS est répété jusqu'à M12. Cepedant un RSS peut disparaître d'envois successifs car :

Ces observations manquantes provoquent des erreurs lors du calcul de l'évolution de la valorisation. En effet, lorsque qu'un RSS disparaît, sa valeur n'apparaît pas en négatif le mois suivant. La valorisation totale est donc faussée, car pour la facturation cette somme est bien retirée.

La solution est d'ajouter des observations qui ajoute un montant à 0. Par la suite, ceci permettra de compter une différence de valorisation égale à la différence entre la valorisation du mois précédent et celle de cette observation vide, autrement dit une valorisation négative du mois précédent.

Préalable

Principe

  1. Grouper les observations par RSS et trier par mois d'envoi ;
  2. Identifier les observations pour lequelles le mois suivant manque ;
  3. Sélectionner ces observations, créer de observations vides avec comme seules informations les identifiants (RSS, NDA), le mois d'envoi qui manque. Les autres valeurs seront NA.

Réalisation

envois_manquants <- db %>%
  # 1.1 Grouper par RSS
  group_by(rss) %>%
  # 1.2 Trier par mois d'envoi
  arrange(mois_envoi) %>%
  # 2 Identifier les observations dont l'envoi suivant est manquant
  mutate(
    # 2.1 Créer un vecteur avec le numéro du mois suivant. Ce vecteur est un
    # décalage du vecteur `mois_envoi` en retirant le premier élément. Le
    # dernier élément est `NA`. Je n'utilise pas `mois_envoi[2:n()]` car il peut
    # n'y avoir qu'une seule observation (exemple : les RSS des séjours sortis
    # en M12). La fonction `seq_len` renvoi un entier de longueur 0 lorsque la
    # séquence est de longueur 0 et donc le vecteur de mois_envoi sera null.
    mois_envoi_suivant = c(mois_envoi[seq_len(n()-1)+1], NA),
    # 2.2 L'envoi suivant est considéré comme manquant différence entre le mois
    # d'envoi en cours et le suivant n'est pas égal à 1 ou qu'il n'y a pas de
    # numéro de mois suivant et que le mois en cours n'est pas le dernier mois.
    # Ceci veut dire que le RSS sera renvoyé plus tard.
    envoi_suivant_manque =  
      ((mois_envoi_suivant - mois_envoi != 1) | is.na(mois_envoi_suivant)) & 
      (mois_envoi != 12)
      ) %>% 
  ungroup %>%
  # Ne sélectionner que les envois dont le suivant manque
  filter(envoi_suivant_manque) 

Vérification

# Nombre d'envoi manquants
nrow(envois_manquants)
# Répartition
table(envois_manquants$mois_envoi + 1)
# Envoi manquants mais qui ré-apparaissent plus tard
table(envois_manquants$mois_envoi[!is.na(envois_manquants$mois_envoi_suivant)])

Exemple

exrss <- envois_manquants %>%
  ungroup %>%
  filter(!is.na(envois_manquants$mois_envoi_suivant)) %>%
  .$rss %>%
  as.character

db %>% 
  filter(rss == exrss[2]) %>%
  select(rss, mois_sortie, mois_envoi)

Ajouter des observations virtuelles pour ces envois manquants

db$obs_virtuelle = FALSE
db2 <- envois_manquants %>%
  select(rss, nda, mois_envoi, mois_sortie) %>%
  mutate(
    mois_envoi = as.integer(mois_envoi + 1),
    obs_virtuelle = TRUE) %>%
  bind_rows(db) %>%
  arrange(rss, mois_envoi)

Vérifier le résultat

db2 %>% 
  filter(rss == exrss[2]) %>%
  select(rss, mois_sortie, mois_envoi, obs_virtuelle, mnt_tot_am) 

Sauvegarde

saveRDS(db2, '../produced_data/20_vvs_2017_avec_manquants.rds')


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