2013-06-30 10 views
6

come è possibile riprodurre questo risultato del loess utilizzando loess con lowess?Come ottenere il loess di R e le funzioni di lowess di R per ottenere lo stesso risultato?

codice loess:

> data = data.frame(x=c(1,0.5,3,4,5,5.5,6,7), y=c(10, 25, 38, 44.5, 500, 550, 600, 705)) 
> fit = loess("y ~ x", data=data) 
> new_y = predict(fit, data$x) 
> new_y 
[1] 6.251022 28.272100 -2.840750 150.006042 481.927307 563.161187 640.825415 693.166150 

codice lowess:

> new_fit = lowess(data, f=0.8) 
> new_fit 
$x 
[1] 0.5 1.0 3.0 4.0 5.0 5.5 6.0 7.0 

$y 
[1] -4.330119 38.931265 255.000000 400.000000 500.000000 550.241949 601.519903 704.247275 

I risultati sono molto diversi. Sto cercando di ottenere nuovi valori adattati per y dati valori di x. loess

[1] 6.251022 28.272100 -2.840750 150.006042 481.927307 563.161187 640.825415 693.166150 

Mentre lowess dà:

[1] -4.330119 38.931265 255.000000 400.000000 500.000000 550.241949 601.519903 704.247275 

Come posso riscrivere la mia lowess chiamata a dare risultati molto simili per i nuovi y valori come predict con loess in forma e x valori? Grazie.

+0

Lo stesso? Richiesta irragionevole? Non sono l'elettore vicino, ma capisco l'impulso. –

+0

@Dwin: ovviamente, quando dico lo stesso, intendo simile. -2.8 e 255 non sono simili. – user248237dfsf

+0

Penso che sia irragionevole aspettarsi che due diversi smoother non parametrici producano "lo stesso risultato" in tutti i punti da un piccolo set di dati che ha più di due log10 di intervallo. Scelgono un diverso "punto di cambio" e i punti di cambio di presa sono notoriamente difficili. –

risposta

3

Perché ne hai bisogno?

Non penso che si possa fare nel caso generale. Ecco un caso specifico, che dà risultati quasi identici, ma l'ultimo valore è ancora diverso per qualche motivo:

fit1 <- loess(y~x,data=data,span=0.8,degree=1) 
predict(fit1) 
#[1] 19.08622 12.55692 37.93642 188.35019 401.53528 506.87040 591.41854 740.71060 

fit2 <- lowess(data$x,data$y,f=0.8,iter=0) 
fit2 

# $x 
# [1] 0.5 1.0 3.0 4.0 5.0 5.5 6.0 7.0 
# 
# $y 
# [1] 12.55692 19.08622 37.93642 188.35019 401.53528 506.87040 591.41854 741.12187 
#Note that lowess reorders by x. 
+0

Ma come puoi renderlo simile alle funzioni di default di 'loess'? Voglio farlo poiché 'lowess' è più veloce e non sto usando le caratteristiche di equazione di' loess', solo un semplice 'y ~ x' – user248237dfsf

+0

Forse invece di richiedere l'uguaglianza dovresti spiegare quali" caratteristiche "di' loess' che preferisci. –

+0

@DWin: 'loess' ha funzionato sui miei dati.Quindi voglio solo quella funzionalità ma più veloce. Non è irragionevole supporre che dovrebbero dare risposte simili ... è confuso che le impostazioni predefinite siano molto diverse – user248237dfsf

1
data = data.frame(x=c(1,0.5,3,4,5,5.5,6,7), y=c(10, 25, 38, 44.5, 500, 550, 600, 705)) 
fit = loess("y ~ x", data=data) 
new_y = predict(fit, data$x) 
plot(data$x , new_y) 
lines(lowess(data, f=0.8)$x, lowess(data, f=0.8)$y) 
# Obviously lowess with f=0.8 is giving different smoothing 

confronta con un più basso valore F

lines(lowess(data, f=0.8)$x, lowess(data, f=0.5)$y, col="red") 

enter image description here

3

Apparentemente il motivo per cui non può essere fatto è che le due funzioni utilizzano algoritmi distinti sotto il cofano, e l'unica spiegazione che ho trovato è di Brian Ripley qui:

http://www.mail-archive.com/[email protected]/msg63623.html

"It is not possible: the algorithms differ considerably in their details. 

... 

In determining 'local' loess() uses a tricubic weighting, lowess() uses a 
uniform weighting (on reading the code)." 

La documentazione chiarisce come scegliere le span/f parametri essere simile a quella predefinita, ma tutti gli altri parametri non sono inter-traslabile tra le due funzioni a causa del livellamento distinta algoritmi utilizzati.