2017-03-01 1 views
1

Ich habe eine Matrix, die 12 Variablen mit jeweils 1343 Beobachtungen enthält. Ich möchte die Autokorrelation für jede dieser Variablen berechnen und die volle Länge der Daten dafür verwenden, d. H. lag.max = 1343.Autokorrelation von multivariaten Zeitreihen in R

Mit der acf() Funktion kann ich die Autokorrelation für eine einzelne Variable berechnen, aber ich möchte alle 12 in einem einzigen Matrixplot (3 x 4) plotten.

acf(linear[,1],lag.max = (length(linear))) Verwendung produziert:

auto-correlation of a single variable

Meine Daten sieht wie folgt aus:

> class(linear) 
[1] "matrix" 

> str(linear) 
num [1:1343, 1:12] -102 -101 -101 -101 -101 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:1343] "2017-01-20 16:30:00" "2017-01-20 16:45:00" "2017-01-20 17:00:00" "2017-01-20 17:15:00" ... 
    ..$ : chr [1:12] "DO0182U09A3" "DO0182U09B3" "DO0182U09C3" "DO0182U21A1" ... 

Ich habe versucht, den Bereich der Spalten in der linearen Matrix vorbei

acf(linear[,1:12], lag.max = 1343) 

aber es scheint eine Art von ACF-Plot zu produzieren Die Überschriften in jedem Diagramm scheinen ein Korrelationsdiagramm zu sein, siehe das Bild unten.

Aus dem Lesen der Details in ?acf sehe ich, dass Sie eine multivariate Zeitreihe übergeben können, die ich glaube, dass mein linear Objekt ist, aber noch bekomme ich das Korrelationsdiagramm wie unten.

Könnte mein Problem sein, dass vor der Erstellung linear ich ein Objekt namens wideRawXTS hatte.

> str(wideRawXTS) 
An ‘xts’ object on 2017-01-20 16:30:00/2017-02-03 16:00:00 containing: 
    Data: num [1:1343, 1:12] -102 -101 -101 -101 -101 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:12] "DO0182U09A3" "DO0182U09B3" "DO0182U09C3" "DO0182U21A1" ... 
    Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
    xts Attributes: 
NULL 

Da es wurden Werte in einigen der Variablen fehlt führte ich eine lineare Interpolation wie folgt:

linear <- apply(wideRawXTS, 2, na.interpolation, option = "linear") 

Muss ich die erste Spalte von linear zu einem XTS Objekt zurückzuverwandeln?

Kann mir jemand eine Anleitung geben, wo ich bei der Erstellung der Autokorrelationsmatrix falsch liegen kann?

> head(linear) 
        DO0182U09A3 DO0182U09B3 DO0182U09C3 DO0182U21A1 DO0182U21A2 DO0182U21A3 DO0182U21B1 DO0182U21B2 DO0182U21B3 
2017-01-20 16:30:00  -101.50  -103.37  -103.86  -104.78  -104.95  -105.33  -102.50  -99.43  -104.05 
2017-01-20 16:45:00  -101.32  -102.75  -104.22  -104.51  -103.94  -105.29  -102.82  -101.99  -103.94 
2017-01-20 17:00:00  -101.45  -103.30  -103.93  -104.70  -104.82  -105.13  -103.72  -103.95  -104.25 
2017-01-20 17:15:00  -100.91  -95.92  -99.22  -103.83  -104.72  -105.19  -103.57  -101.36  -104.09 
2017-01-20 17:30:00  -100.91  -103.04  -104.09  -102.15  -104.91  -105.18  -103.88  -104.09  -103.96 
2017-01-20 17:45:00  -100.97  -103.67  -104.12  -105.07  -104.23  -97.48  -103.92  -103.89  -104.01 
        DO0182U21C1 DO0182U21C2 DO0182U21C3 
2017-01-20 16:30:00  -104.51  -104.42  -105.17 
2017-01-20 16:45:00  -104.74  -104.65  -105.25 
2017-01-20 17:00:00  -105.02  -105.04  -105.32 
2017-01-20 17:15:00  -103.90  -102.95  -105.16 
2017-01-20 17:30:00  -104.75  -105.07  -105.23 
2017-01-20 17:45:00  -105.08  -105.14  -104.89 

odd plot

Basierend auf dem Feedback von @ eipi10 hier ist die Ausgabe von ihrem Vorschlag. Mein Laptop brauchte ungefähr 20 Minuten, um das zu berechnen, aber ich habe keine Ahnung, was es darstellt !! Alle Plots sehen genau gleich aus.

enter image description here

+1

Ist dies tun, was Sie suchen: 'par (mfrow = c (3,4)); sapply (linear, acf, lag.max = nrow (linear)) ' – eipi10

+0

@ eipi10 danke für die antwort, deine kommentare haben zwar einen matrix plot ergeben aber ich habe keine ahnung was es darstellt! Die horizontale Skala scheint durcheinander zu sein. Ich weiß nicht, wie man Kommentare zu Bildern hinzufügt, aber ich ändere den ursprünglichen Beitrag mit der Ausgabe. – TheGoat

Antwort

1

linear ist eine Matrix. Damit der Code in meinem ersten Kommentar funktioniert, muss linear in einen Datenrahmen konvertiert werden oder jede Spalte muss explizit referenziert werden. Der folgende Code nimmt den zweiten Ansatz:

par(mfrow=c(3,4)) 

set.seed(2) 
linear = matrix(cumsum(rnorm(12*50)), ncol=12) 

sapply(1:ncol(linear), function(i) { 
    acf(linear[,i], main=paste("Column:", i), lag.max=nrow(linear)) 
    }) 

enter image description here

+0

danke noch einmal, das hat für mich funktioniert. Eine Sache, die ich nicht herausfinden kann, ist, wie man den Spaltennamen des neuen Datenrahmens weitergibt, während man sich durch jede der Spalten bewegt. Ich habe versucht 'linearDF <- as.data.frame (linear) sapply (1: ncol (linearDF), Funktion (i) { acf (linearDF [, i], main = Spaltennamen (linearDF [, i]), lag.max = nrow (linearDF)) }), aber für jeden Unterplot-Titel bekomme ich eine Liste aller Spaltennamen und nicht die spezifische Spalte, in der sie durchläuft. Irgendwelche Vorschläge? – TheGoat

+0

eine Idee, wie ich die Spaltennamen zu jedem der Matrixplots übergeben kann? – TheGoat

Verwandte Themen