2013-07-08 17 views
5

ho questo frame di dati:come costruire un modello di loess in in R utilizzando dati di serie temporali

dput (testa (y1,20))

structure(list(time = structure(c(1373256120, 1373256360, 1373256660, 
1373256960, 1373257260, 1373257560, 1373257860, 1373258220, 1373258460, 
1373258760, 1373259060, 1373259360, 1373259660, 1373259960, 1373260260, 
1373260620, 1373260860, 1373261160, 1373261460, 1373261760), class = c("POSIXct", 
"POSIXt"), tzone = "America/New_York"), cpu = c(2.5803, 2.7954, 
3.0855, 2.6414, 2.4603, 2.2053, 3.2352, 2.2437, 2.0264, 1.9006, 
4.331, 2.068, 1.999, 1.8115, 1.8955, 1.7475, 1.8565, 2.1557, 
1.9113, 1.3635)), .Names = c("time", "cpu"), row.names = c(NA, 
20L), class = "data.frame") 

Sto cercando di costruire un modello loess come folows:

ls<-loess(cpu~time, data=y1) 

ottengo questo errore:

Error in simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize, : 
    NA/NaN/Inf in foreign function call (arg 2) 
In addition: Warning message: 
In simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize, : 
    NAs introduced by coercion 

Cosa mi manca qui?

+0

"loess' può essere un IME un po 'fragile. Prova a giocare con l'estensione; puoi anche usare 'family =" gaussian "' per eseguire il fitting dei minimi quadrati piuttosto che il più complicato metodo robustified che è il default. –

+0

Si potrebbe anche usare 'mgcv :: gam' o' gam :: gam', che sono altri modi per montare i modelli di regressione locali (anche se con le spline nel primo caso). –

risposta

5

È necessario convertire le variabili in valori numerici e assicurarsi che siano finiti.

with(y1,{ 
    ok <- is.finite(time) & is.finite(cpu) 
    x <- as.numeric(time)[ok] ## you reproduce the error without coercion 
    y <- as.numeric(cpu)[ok] 
    data <- list(x = x, y = y) 
    loess(y~x,data = data) 
}) 

loess(formula = y ~ x, data = data) 
Number of Observations: 20 
Equivalent Number of Parameters: 4.42 
Residual Standard Error: 0.6174 

Utilizzando panel.smoother da latticeExtra è possibile ottenere il risultato senza alcuna manipolazione (si dovrebbe fare il lavoro sopra internamente)

library(latticeExtra) 
xyplot(cpu ~ time ,type='l',data=y1)+ 
    layer(panel.smoother(y ~ x, span = 0.75),style=2) 

enter image description here

+0

@agsstudy, lo scopo di questo esercizio è estrarre i dati modellati e tracciarli in javascript. Vedo che dentro con il loess funziona, ma quando lo faccio al di fuori del con, non funziona. come faccio a fare qualcosa di simile a ls <-loess (cpu ~ time, data = y1)? – user1471980

+0

Io uso 'with' per evitare $ quando accedo alle variabili, ... Puoi rimuoverlo in questo modo: ok <- is.finite (y1 $ time) e is.finite (y1 $ cpu) .. e continua per tutte le altre affermazioni ... Spero sia chiaro. – agstudy

+0

Ho capito grazie. – user1471980

0

Utilizzando ggplot() è abbastanza facile da tracciare modelli loess. È l'impostazione predefinita per geom_smooth(). Quindi non hai nemmeno bisogno di calcolarlo, puoi tracciarlo direttamente.

df <- data.frame(time = as.numeric(dput$time), cpu = as.numeric(dput$cpu)) 

ggplot(df, aes(time, cpu)) + 
    geom_line(aes(colour = "red")) + geom_smooth(aes(colour = "black")) 
+0

Bel, sì, amo ggplot, ma l'unica cosa è che ho bisogno di rendere questi grafici interattivi. – user1471980

+0

Controlla questo: http://www.youtube.com/watch?v=iSXNfZESR5I – marbel

Problemi correlati