difference entre lowess et loess

Questions sur les fonctions statistiques de R

Modérateur : Groupe des modérateurs

Tillard
Messages : 87
Enregistré le : 17 Déc 2004, 10:32

difference entre lowess et loess

Messagepar Tillard » 23 Mar 2005, 09:01

Bonjour a tous
quelqu'un connait-il la difference entre les fonctions lowess et loess?
chacune de ces 2 fonctions, appliquée sur un jeu de données binaires, avec une parametrisation identique (enfin je crois) donne des resultats (smoothed) differents.
la question a deja ete posé sur le forum de R et comme reponse: "lowess est obsolete, utiliser loess", ce qui est un peu court. La fonction loessFit du package limma donne des resultats similaires a lowess.
ci apres un petit exemple reproductible

library(car)
data(Mroz)
Mroz
Mroz$lfpn<-ifelse(Mroz$lfp=="yes",1,0)
Mroz<-Mroz[order(Mroz$lwg),]
Mroz.low<-with(Mroz, {
loess(lfpn ~ lwg, span=0.8,loess.control(iterations=0))})
Mroz.low1<-with(Mroz, {
lowess(lwg, lfpn, f=0.8,iter=0)})
Mroz.low$fitted
Mroz.low1$y

plot(Mroz$lwg,Mroz.low$fitted,type="l",col="red",ylim=c0.3,1.4),
xlab="lwg",ylab="smoothed")
lines(Mroz$lwg,Mroz.low1$y,col="blue")
legend(x=-2,y=0.6,legend=c("loess","lowess"),lty=1,col=c("red","blue"))

mon objectif: explorer la linearite de la relation entre un y binaire et une covariable x continue (cf Dohoo et al., veterinary epidemiologic research, page 356). La ref utilise stata qui utilise aussi une fonction lowess, mais avec aussi (???) des resultats differents de ceux de R. Bref, un beau b....
amicalement
Emmanuel Tillard
UMR ERRC (Elevage des Ruminants en Regions Chaudes)
CIRAD - St PIERRE (La Réunion)
tel: 02 62 49 92 54

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: difference entre lowess et loess

Messagepar Renaud Lancelot » 24 Mar 2005, 06:26

Salut Manu,

Tillard a écrit :Bonjour a tous
quelqu'un connait-il la difference entre les fonctions lowess et loess?
chacune de ces 2 fonctions, appliquée sur un jeu de données binaires, avec une parametrisation identique (enfin je crois) donne des resultats (smoothed) differents.
la question a deja ete posé sur le forum de R et comme reponse: "lowess est obsolete, utiliser loess", ce qui est un peu court. La fonction loessFit du package limma donne des resultats similaires a lowess.
ci apres un petit exemple reproductible

library(car)
data(Mroz)
Mroz
Mroz$lfpn<-ifelse(Mroz$lfp=="yes",1,0)
Mroz<-Mroz[order(Mroz$lwg),]
Mroz.low<-with(Mroz, {
loess(lfpn ~ lwg, span=0.8,loess.control(iterations=0))})
Mroz.low1<-with(Mroz, {
lowess(lwg, lfpn, f=0.8,iter=0)})
Mroz.low$fitted
Mroz.low1$y

plot(Mroz$lwg,Mroz.low$fitted,type="l",col="red",ylim=c0.3,1.4),
xlab="lwg",ylab="smoothed")
lines(Mroz$lwg,Mroz.low1$y,col="blue")
legend(x=-2,y=0.6,legend=c("loess","lowess"),lty=1,col=c("red","blue"))

mon objectif: explorer la linearite de la relation entre un y binaire et une covariable x continue (cf Dohoo et al., veterinary epidemiologic research, page 356). La ref utilise stata qui utilise aussi une fonction lowess, mais avec aussi (???) des resultats differents de ceux de R. Bref, un beau b....
amicalement



Tu peux avoir des résultats très proches en spécifiant degree = 1 dans loess (le défaut est degree = 2: lissage quadratique):

Code : Tout sélectionner

library(car)
data(Mroz)
Mroz$lfpn <- ifelse(Mroz$lfp == "yes", 1, 0)

Mroz <- Mroz[order(Mroz$lwg),]

Mroz.low <- with(Mroz, {
    loess(lfpn ~ lwg, span = 0.8, degree = 1,
          loess.control(iterations = 0))})

Mroz.low1 <- with(Mroz, {
    lowess(lwg, lfpn, f = 0.8, iter = 0)})

plot(Mroz$lwg, fitted(Mroz.low), type = "l", col = "red",
     ylim = c(0.3, 1.4), xlab = "lwg", ylab = "smoothed")
     
lines(Mroz$lwg, Mroz.low1$y, col = "blue")

legend(x = -2, y = 0.6,
       legend = c("loess", "lowess"),
       lty = 1, col = c("red", "blue"))



Les résultats sont légèrement différents. C'est normal, car les algorithmes sont différents, et loess dispose de multiples options. Ce serait difficile, voire impossible, de les régler pour avoir exactement les mêmes résultats que loess.

Pour ton problème, je pense qu'il ne faut pas trop s'embêter: c'est de l'exploration, pour voir si la relation est approximativement linéaire. Sachant que loess et lowess sont conçus pour explorer les relations entre des variables quantitatives, ce ne sont d'ailleurs pas des outils appropriés dans ton cas.

Pour répondre à cette situation, j'utilise depuis longtemps et avec satisfaction la fonction gam (generalized additive model), que tu peux trouver sur le CRAN dans le package du même nom. Cette fonction est un clone de la fonction gam de S+.

Il y a une implémentation avec de nombreuses améliorations et extensions dans le package mgcv disponible dans la distribution standard de R. Cependant, c'est plus compliqué que gam, surtout pour les habitués de la fct gam de S+.

La référence de base des gam est:

Hastie, T.J., Tibshirani, R.J., 1990. Generalized additive models. London, Chapman & Hall, 335 p.

La méthode et l'algorithme (back-fitting algorithm) sont assez critiqués, mais pour faire de l'exploration, je ne pense pas que ce soit la peine de trop en faire...

Amicalement,

Renaud

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 24 Mar 2005, 15:11

Complément à ma réponse de ce matin, concernant gam:

Code : Tout sélectionner

library(car)
data(Mroz)

Mroz$lfpn <- ifelse(Mroz$lfp == "yes", 1, 0)
Mroz <- Mroz[order(Mroz$lwg), ]
lows <- with(Mroz, lowess(lwg, lfpn))
fm1 <- loess(lfpn ~ lwg, degree = 1, data = Mroz)

library(gam)
fm2 <- gam(lfpn ~ s(lwg), family = binomial, data = Mroz)
fm3 <- gam(lfpn ~ lo(lwg), family = binomial, data = Mroz)

Mroz$cl_lwg <- with(Mroz,
  cut(lwg, breaks = quantile(lwg, probs = seq(0, 1, .01)), include.lowest = TRUE))

qtl <- quantile(Mroz$lwg, probs = seq(0, 1, .01))
ctr <- unname(qtl[-length(qtl)] + diff(qtl)/2)
val <- as.vector(with(Mroz, tapply(lfpn, cl_lwg, mean)))

plot(Mroz$lwg, lows$y, type = "l", col = "red",
  ylim = c(0, 1.4), xlab = "lwg", ylab = "smoothed")
points(ctr, val)
lines(Mroz$lwg, fitted(fm1), col = "blue")
lines(Mroz$lwg, fitted(fm2), col = "green")
lines(Mroz$lwg, fitted(fm3), col = "pink")

legend(x = -2, y = 0.6,
       legend = c("lowess", "loess", "gam - s", "gam - lo"),
       lty = 1, col = c("red", "blue", "green", "pink"))


Explication: j'ai calculé les moyennes de la réponse (en 0 / 1) par intervalle de la variable explicative pour mieux "voir" les données de Bernoulli agrégées en données binomiales, et j'ai ajouté les points sur le graphe.

Avec les réglages par défaut, lowess et loess sont dans les choux, alors que gam fournit des moyennes "réalistes", que ce soit avec un lisseur loess (fm3) ou spline (fm2). On peut jouer avec lo() et s().

Pour répondre à ta question initiale et revenir à ton problème, il suffit de faire:

Code : Tout sélectionner

plot(fm)

sur ton "vrai" modèle pour évaluer si l'hypothèse de linéarité sur l'échelle du lien (logit pour régression logistique)est plausible ou pas.

Amitiés,

Renaud

Tillard
Messages : 87
Enregistré le : 17 Déc 2004, 10:32

Messagepar Tillard » 29 Mar 2005, 09:10

Salut Renaud,
merci pour cette reponse tres complete
je n'avais encore jamais utilisé gam, mais ca parait effectivement tres efficace
amicalement
Emmanuel Tillard

UMR ERRC (Elevage des Ruminants en Regions Chaudes)

CIRAD - St PIERRE (La Réunion)

tel: 02 62 49 92 54

Tillard
Messages : 87
Enregistré le : 17 Déc 2004, 10:32

Messagepar Tillard » 04 Avr 2005, 14:24

Avec les réglages par défaut, lowess et loess sont dans les choux, alors que gam fournit des moyennes "réalistes", que ce soit avec un lisseur loess (fm3) ou spline (fm2). On peut jouer avec lo() et s().

Pour répondre à ta question initiale et revenir à ton problème, il suffit de faire:

Code : Tout sélectionner

plot(fm)

sur ton "vrai" modèle pour évaluer si l'hypothèse de linéarité sur l'échelle du lien (logit pour régression logistique)est plausible ou pas.

Amitiés,

Renaud[/quote]

j'ai trouve sur le web un doc de J. Fox qui synthetise et complete bien les éléments de réponse de cette question (difference lowess et loess, tester la linearite avec gam): c'est a l'adresse

http://socserv.mcmaster.ca/jfox/Books/C ... ession.pdf

amicalement
Emmanuel Tillard

UMR ERRC (Elevage des Ruminants en Regions Chaudes)

CIRAD - St PIERRE (La Réunion)

tel: 02 62 49 92 54


Retourner vers « Archives : Fonctions statistiques »

Qui est en ligne

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