predict.function

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

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

predict.function

Messagepar Gabriel Terraz » 23 Jan 2023, 13:20

Bonjour à tous,

Je travaille avec des listes qui contiennent (entres autres) un élément qui peut être :
- Une fonction quelconque
- Un objet pour qui la fonction predict() existe, par exemple un objet de class "lm".

L'idée serait de créer une fonction predict pour la class "function" et ainsi de pouvoir utiliser predict() quelque soit le contenu de la liste (fonction ou modèle).

Exemple pour les deux cas :

Code : Tout sélectionner

# Exemple avec une fonction quelconque
maliste1 <- list(a = 1:10,
                 b = function(x) - x
)

# Exemple avec objet qui a une méthode pour predict
model <- lm(rnorm(10) ~ runif(10))
maliste2 <- list(a = 1:10,
                 b = model)


Comme attendu cela fonctionne que dans le deuxième cas :

Code : Tout sélectionner

predict(maliste1$b, newdata = data.frame(maliste1$a))

# Error in UseMethod("predict") :
#  no applicable method for 'predict' applied to an object of class "function"

predict(maliste2$b, newdata = data.frame(maliste2$a))

#          1           2           3           4           5           6           7           8           9          10
#-0.29367649 -0.25229627 -0.08782978 -0.18444959 -0.08843830 -0.16306699 -0.18816203 -0.30699163 -0.16526367 -0.26676358


En créant la fonction predict pour la classe "function", cela fonctionne.

Code : Tout sélectionner

predict.function <- function(object, newdata){
  object(newdata[[1]])
}
predict(maliste1$b, newdata = data.frame(maliste1$a))
#[1]  -1  -2  -3  -4  -5  -6  -7  -8  -9 -10


Est-ce que cela vous parait une "bonne idée" ou est-ce qu'il y aurait des choses auxquelles je n'aurais pas pensé qui rendrait cette pratique "dangereuse" à un moment donné ?

Merci pour votre avis

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: predict.function

Messagepar Logez Maxime » 24 Jan 2023, 10:19

Bonjour,

Ca ma parait un peu étrange d'utiliser une fonction pour utiliser la fonction elle même.
De plus la classe des fonctions regroupe un très très grand panel d'objets qui ont tous des fonctionnements différents, alors que la fonction predict est normalement utilisée pour des objets qui sont des sorties de modèles statistiques. Ajouter une fonction predict pour des fonctions c'est faire un mélange des genres qui ne me semble pas très opportuns.

Je comprends la logique, mais pourquoi ne pas tout simplement faire une fonction qui s'adapte à tes types d'objets ? Si c'est une fonction alors tu l'appliques, sinon tu utilises predict ... Ce n'est que mon point de vue.

En plus fait attention, les modèles comme les lm sont plus 'sécurisés' quand tu utilises des formules associées à des data.frame et dont les termes de la formule sont le nom des colonnes des data.frame. Ici j'ai un comportement étrange, qui vient du runif(10) dans la formule du modèle qui fait qu'à chaque fois que je fais un prédict avec ton modèle j'ai des valeurs prédites différentes.

Cordialement,
Maxime

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: predict.function

Messagepar Gabriel Terraz » 25 Jan 2023, 09:36

Merci pour ton retour,

L'idée était de pouvoir utiliser predict() sans se poser de question sur l'input car c'est une fonction largement utilisée et intuitive, et dans notre cas, déjà utilisée pour les cas où l'input est un modèle.

A priori, dans notre cas, ce seraient des fonctions plutôt simples avec un vecteur en entrée et un en sortie, ce qui devrait limiter les dommages collatéraux.

Mais effectivement je peux tout autant faire une fonction qui aurait 2 comportements selon l'entrée.

A réfléchir...

Pour ce qui est du modèle, c'était juste un exemple bidon, donc pas de soucis de ce coté là.

Merci,
Gabriel


Retourner vers « Questions en cours »

Qui est en ligne

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