2012-11-27 10 views
7

Użycie apendy (lub sapply) na obiekcie mts usuwa jego właściwości serii czasowych podczas wysyłania do funkcji. Jak mam zastosować tę samą funkcję (z wejściem ts i wyjściem ts) na każdym szeregu razy w obiekcie mts i zwrócić go (najlepiej jako mts) [mam na myśli oprócz używania pętli]?Użycie Zastosuj rodzinę funkcji na obiektach mts

Na przykład załóżmy, że napisać funkcję, która zwraca trendu szeregu czasowego (za pomocą stl)

myfunc <- function(x) { 
     return(stl(x,"per")$time.series[,2]) 
} 

Teraz dla próbki mts

z <- ts(matrix(rnorm(90), 30, 3), start=c(1961, 1), frequency=4) 
class(z) 

Wysyłanie tylko jedną z prac szeregów czasowych poprawne:

myfunc(z[,1]) # works correctly, returns the trend of first series 

Moja funkcja nie jest przeznaczona do wielu serii czasowych, więc:

myfunc(z) # will not work returning the error below 

Error in stl(x, "per") : only univariate series are allowed 

Korzystanie zastosować na MTS sprzeciw wysłać każdy z szeregów czasowych jako wektor, nie zachowując swoje właściwości szeregu czasowego (TSP):

apply(z,2,myfunc) # will not work returning the error below 

Error in stl(x, "per") : 
series is not periodic or has less than two periods 
+1

Prawda, "zastosuj" usunie atrybuty, ale 'sapply' nie powinno tego robić. Obiekty 'ts' są dziwne. Często mają metody drukowania, które wprowadzają użytkownika w błąd co do jego prawdziwych struktur, więc powinieneś używać na nich metody str(). –

+0

Czy możesz podać kod przy użyciu Sapply w moim przykładzie? Dowiedziałem się, że używając sapply podniósł ten sam błąd, ponieważ po prostu wywołają się same. –

+1

I o dziwaczności obiektów 'ts'! Nie używam ani nie polegam na żadnej metodzie drukowania, muszę znać jej właściwości szeregów czasowych, tj. 'Łyżeczka', która jest tylko wektorem o długości 3, wskazującym początek, koniec i częstotliwość szeregów czasowych danych –

Odpowiedz

8

prosty sposób wokół tego jest praca z indeksami zamiast czystego apply:

sapply(seq_len(ncol(z)),function(i) myfunc(z[,i])) 

apply daje czyste wektorów wewnątrz funkcji, gdyż najpierw przekształca obiekt do matrycy. Dzięki zastosowaniu funkcji [ zdefiniowanej dla obiektów szeregów czasowych, masz pewność, że za każdym razem wyodrębniasz prawidłową serię czasową.

+0

ładne rozwiązanie. – agstudy

3

zmienić myfunc aby sprawdzić, czy mają Obiekt ts jako parametr x.

Jeśli x nie jest ts, to jest konwertowane na obiekt ts jako stl potrzebny ten typ parametru.

myfunc <- function(x,...){ 
     y <- x 
     if(class(x) != 'ts') { 
     dots <- c(...) 
     y <- ts(x,start=c(dots[1], dots[2]), frequency=dots[3]) 
     } 
     return(stl(y,"per")$time.series[,2]) 
    } 
    ## no need to conversion (already ts object) 
    myfunc(z[,1]) 


    ## mts object (here we give parameter necessary for conversion) 
    apply(z,2,myfunc,1961,1,4) 
+0

i jeśli muszę mieć wynik jak sam: ts (zastosowanie (z, 2, myfunc, 1961,1,4), start = c (1961, 1), częstotliwość = 4) –

+0

Problem z tą odpowiedzią jest taki, że nie zawsze piszemy funkcję 'myfunc '. Najczęściej używamy po prostu czyjegoś kodu. –