Le altre risposte sono tutte buone approcci. Tuttavia, ci sono alcune altre opzioni in R che non sono state menzionate, tra cui lowess
e approx
, che possono offrire migliori adattamenti o prestazioni più veloci.
I vantaggi sono più facilmente dimostrati con un set di dati alternativo:
sigmoid <- function(x)
{
y<-1/(1+exp(-.15*(x-100)))
return(y)
}
dat<-data.frame(x=rnorm(5000)*30+100)
dat$y<-as.numeric(as.logical(round(sigmoid(dat$x)+rnorm(5000)*.3,0)))
Ecco i dati sovrapposto con la curva sigmoidale che lo ha generato:

Questo tipo di dati è comune quando si guarda ad un comportamento binario tra una popolazione. Ad esempio, questo potrebbe essere un complotto sul fatto che un cliente abbia acquistato o meno qualcosa (un binario 1/0 sull'asse delle ordinate) rispetto alla quantità di tempo trascorso sul sito (asse x).
Un numero elevato di punti viene utilizzato per dimostrare meglio le differenze di prestazioni di queste funzioni.
Smooth
, spline
e smooth.spline
tutti producono senza senso su un set di dati come questo con qualsiasi insieme di parametri che ho provato, forse a causa della loro tendenza a mappare ad ogni punto, che non funziona per i dati rumorosi.
I loess
, lowess
, e approx
funzioni tutti producono risultati utili, anche se appena per approx
. Questo è il codice per ogni utilizzando parametri leggermente ottimizzati:
loessFit <- loess(y~x, dat, span = 0.6)
loessFit <- data.frame(x=loessFit$x,y=loessFit$fitted)
loessFit <- loessFit[order(loessFit$x),]
approxFit <- approx(dat,n = 15)
lowessFit <-data.frame(lowess(dat,f = .6,iter=1))
E i risultati:
plot(dat,col='gray')
curve(sigmoid,0,200,add=TRUE,col='blue',)
lines(lowessFit,col='red')
lines(loessFit,col='green')
lines(approxFit,col='purple')
legend(150,.6,
legend=c("Sigmoid","Loess","Lowess",'Approx'),
lty=c(1,1),
lwd=c(2.5,2.5),col=c("blue","green","red","purple"))

Come si può vedere, lowess
produce una misura quasi perfetta alla curva generatrice originale . Loess
è vicino, ma subisce una strana deviazione su entrambe le code.
Sebbene il set di dati sia molto diverso, ho riscontrato che altri set di dati funzionano in modo simile, con loess
e lowess
in grado di produrre buoni risultati. Le differenze diventano più significativo se si guarda a parametri di riferimento:
> microbenchmark::microbenchmark(loess(y~x, dat, span = 0.6),approx(dat,n = 20),lowess(dat,f = .6,iter=1),times=20)
Unit: milliseconds
expr min lq mean median uq max neval cld
loess(y ~ x, dat, span = 0.6) 153.034810 154.450750 156.794257 156.004357 159.23183 163.117746 20 c
approx(dat, n = 20) 1.297685 1.346773 1.689133 1.441823 1.86018 4.281735 20 a
lowess(dat, f = 0.6, iter = 1) 9.637583 10.085613 11.270911 11.350722 12.33046 12.495343 20 b
Loess
è estremamente lento, prendendo 100x finché approx
. Lowess
produce risultati migliori rispetto a approx
, mentre è ancora abbastanza veloce (15 volte più veloce di loess).
Loess
diventa sempre più impantanato quando il numero di punti aumenta, diventando inutilizzabile intorno a 50.000.
MODIFICA: ulteriori ricerche mostrano che loess
offre adattamenti migliori per determinati set di dati. Se hai a che fare con un set di dati di piccole dimensioni o le prestazioni non sono una considerazione, prova entrambe le funzioni e confronta i risultati.
Dipende interamente su ciò che i vostri dati è e perché si sta lisciandolo! I dati sono importanti? Densità?Misure? Che tipo di errore di misura potrebbe esserci? Che storia stai cercando di dire ai tuoi lettori con il tuo grafico? Tutti questi problemi influenzano se e in che modo è necessario uniformare i dati. – Harlan
Questi sono dati misurati. Ai valori x 1, 2, 3, ..., 10 alcuni sistemi hanno fatto 2, 4, 6, ..., 20 errori. Probabilmente queste coordinate non dovrebbero essere modificate dall'algoritmo di adattamento. Ma voglio simulare gli errori (y) ai valori x mancanti, per esempio nei dati, f (4) = 8 e f (5) = 7, quindi presumibilmente f (4.5) è qualcosa tra 7 e 8, usando qualche polinomio o altra levigatura. – Frank
In tal caso, con un singolo punto di dati per ogni valore di x, non mi andrebbe affatto bene. Avrei solo dei punti grandi per i miei punti dati misurati, con linee sottili che li collegano. Qualcos'altro suggerisce allo spettatore che sai di più sui tuoi dati di te. – Harlan