2012-05-08 8 views
6

Sto facendo analisi sulle precipitazioni orarie su un file che è disorganizzato. Tuttavia, sono riuscito a pulirlo e memorizzarlo in un dataframe (chiamato CA1), che assume la forma come segue:Serie temporali e stl in R: sono consentite solo serie univariate

Station_ID Guage_Type Lat Long  Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5  H6  H7  H8  H9  H10  H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
1 4457700   HI 41.52 124.03 1948-07-01   8  LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
2 4457700   HI 41.52 124.03 1948-07-05   8  LST 0 1 1 1 1 1 2.0000000 2.0000000 2.0000000 4.0000000 5.0000000 5.0000000 4 7 1 1 0 0 10 13 5 1 1 3 
3 4457700   HI 41.52 124.03 1948-07-06   8  LST 1 1 1 0 1 1 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
4 4457700   HI 41.52 124.03 1948-07-27   8  LST 3 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
5 4457700   HI 41.52 124.03 1948-08-01   8  LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
6 4457700   HI 41.52 124.03 1948-08-17   8  LST 0 0 0 0 0 0 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 6 1 0 0 0 0 0 0 0 0 0 0 

Dove H0 attraverso H23 rappresentano le 24 ore al giorno (riga)

Uso solo CA1 (la dataframe sopra), prendo ogni giorno (riga) di 24 punti e trasposizione verticalmente e concatenare i restanti giorni (righe) a una variabile, che chiamo DAT1:

> dat1[1:48,] 
    H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 4 5 5 4 7 1 1 0 0 10 13 5 1 1 3 

Uso della DAT1 variabile , L'ho inserito come argomento per ottenere i dati di una serie storica:

> rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    frequency = 24) 

Alcune cose da notare:

>dim(CA1) 
    [1] 5636 31 
>length(dat1) 
    [1] 135264 

Così 5636 * 24 (punti dati totali [24] per riga) = 135264 punti totali. La lunghezza (rainCA1) concorda con i punti sopra. Tuttavia, se ho messo fine a se la funzione ts, come ad esempio

>rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    end = c(1900+as.POSIXlt(CA1[5636,5])$year, 1+as.POSIXlt(CA1[5636,5])$mon), 
    frequency = 24) 

ottengo 1134 la lunghezza totale di punti, dove mi manca un sacco di dati. Suppongo che ciò sia dovuto al fatto che le date non sono consecutive e dato che sono solo il mese e l'anno come argomento per il punto di partenza.

Continuando, in quello che penso è il percorso corretto, utilizzando il primo calcolo ts senza l'argomento fine, ho fornirle come input per lo STL:

>rainCA1_2 <-stl(rainCA1, "periodic") 

Purtroppo, ottengo un errore:

Error in stl(rainCA1, "periodic") : only univariate series are allowed 

Che non capisco o come farlo. Tuttavia, se torno alla funzione ts e fornisco l'argomento end, stl funziona bene senza errori.

Ho effettuato ricerche in molti forum, ma nessuno (o a mio parere) fornisce una buona soluzione per ottenere gli attributi dei dati dei dati orari. Se qualcuno mi può aiutare, lo apprezzerò molto. Grazie!

risposta

7

Questo errore è il risultato della forma dei dati. Prova > dim(rainCA1); Sospetto che dia qualcosa come > [1] 135264 1. Sostituisci entro il rainCA1 <- ts(dat1[[1]] ... e dovrebbe funzionare.

Se lo fa correttamente, mi chiedo ... Mi sembra che il primo ordine del giorno sia ottenere i dati in un formato coerente. Assicurati che ts() ottenga il giusto input. Controlla le specifiche precise di ts.

ts() non interpreta i formati di data e ora. ts() richiede punti dati consecutivi con un intervallo fisso. Utilizza un contatore maggiore e un contatore minore (di cui frequency si inserisce in un contatore principale). Ad esempio, se i tuoi dati sono orari e ti aspetti stagionalità al livello giornaliero, frequency equivale a 24.start e end, quindi, sono principalmente cosmetici: start indica semplicemente t (0) per il contatore principale, mentre end indica t (fine).

0

Una soluzione che ho trovato è time_series_var <- ts(data[, c("var_of_interest")]) e quindi time_series_var <- ts(as.vector(time_series_var)) e poi il l'errore relativo a univariato scompare quando le dimensioni sono corrette.