Imputation de notes

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Malarthe Bertrand
Messages : 7
Enregistré le : 15 Mar 2017, 16:11

Imputation de notes

Messagepar Malarthe Bertrand » 16 Mar 2017, 08:14

Bonjour à tous,

Je souhaiterai réaliser une fonction qui impute des valeurs. En évitant une boucle FOR (Je l'ai testé, mais ma bdd comporte plus d'un million de lignes, c'est très long à compiler...)

Je m'explique avec un exemple de mon jeu de données :
Image

Le but de la fonction serait d'imputer sur une nouvelle variable, lorsqu'il y a un NA compris entre deux notes similaires, la même note. Enfin, lorsque la première note (ou les) est NA, l'imputation ne se fait pas.


Merci par avance à toute la communauté.

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Re: Imputation de notes

Messagepar Dominique Soudant » 16 Mar 2017, 09:20

J'essaierais un truc comme ça :
  1. créé une variable next qui contient la donnée suivante de la donnée courante genre next <- c(Note[-1],NA)
  2. créé une variable previous qui contient la données précédente de la donnée courante genre previous <- c(NA, Note[-length(Note)])
  3. créé une variable imputé qui contient la données précédente de la donnée courante genre imputed <- ifelse(is.na(Note) && previous == next, previous, Note)
@+

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Imputation de notes

Messagepar Mickael Canouil » 16 Mar 2017, 09:55

Bonjour,

il serait peut-être bon de regarder du côté des implémentations R de la méthode "nearest neighbour imputation" (http://finzi.psych.upenn.edu/cgi-bin/na ... name=views)

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Malarthe Bertrand
Messages : 7
Enregistré le : 15 Mar 2017, 16:11

Re: Imputation de notes

Messagepar Malarthe Bertrand » 16 Mar 2017, 15:12

Merci pour vos réponses,
mais quelqu'un a t'il une autre solution ?
j'ai essayé la première, elle ne fonctionne pas et renvoie que des NA.
La seconde est assez compliqué, je ne la comprends pas "nearest neighbour imputation"

Encore merci.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Imputation de notes

Messagepar Pierre-Yves Berrard » 16 Mar 2017, 16:05

Malarthe Bertrand a écrit :quelqu'un a t'il une autre solution ?
j'ai essayé la première, elle ne fonctionne pas

Bonjour,

Ce n'est pas parce que ça ne marche pas du premier coup que c'est forcément à jeter.
En capitalisant sur l'idée de Dominique, j'obtiens une version qui marche si le donneur est à une distance maximale de 1 du receveur. Pas parfait, mais on progresse...

Code : Tout sélectionner

Note <- c(0, NA, 0, 1, NA, NA, 1, 2, NA, 3)
nextNote <- c(Note[-1], NA)
previousNote <- c(NA, Note[-length(Note)])

ifelse(
  is.na(Note) &
    !is.na(previousNote) &
    !is.na(nextNote) &
    previousNote == nextNote,
  previousNote,
  Note
)
# [1]  0  0  0  1 NA NA  1  2 NA  3
PY

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Imputation de notes

Messagepar Pierre-Yves Berrard » 16 Mar 2017, 16:30

Une autre idée :

Code : Tout sélectionner

library(tidyr)
library(dplyr)

Note <- c(0, NA, 0, 1, NA, NA, 1, 2, NA, 3)

notes_df <- data.frame(
  Note = Note,
  fill_down = Note,
  fill_up = Note
)

notes_df %>%
  fill(fill_down, .direction = "down") %>%
  fill(fill_up, .direction = "up") %>%
  mutate(imputation = ifelse(fill_down == fill_up, fill_down, NA))
PY

Malarthe Bertrand
Messages : 7
Enregistré le : 15 Mar 2017, 16:11

Re: Imputation de notes

Messagepar Malarthe Bertrand » 17 Mar 2017, 08:30

Pierre-Yves Berrard a écrit :Une autre idée :

Code : Tout sélectionner

library(tidyr)
library(dplyr)

Note <- c(0, NA, 0, 1, NA, NA, 1, 2, NA, 3)

notes_df <- data.frame(
  Note = Note,
  fill_down = Note,
  fill_up = Note
)

notes_df %>%
  fill(fill_down, .direction = "down") %>%
  fill(fill_up, .direction = "up") %>%
  mutate(imputation = ifelse(fill_down == fill_up, fill_down, NA))




Bonjour,

cette méthode fonctionne parfaitement,

un grand merci à vous et aux autres réponses


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité