2016-08-07 34 views
2

Ich habe folgende Original-CodeVerschiedene Ergebnis bei der Multiplikation xts Objekte gegen vector'ed xts Objekte

prices <- c(11.44, 12.64, 13.12, 11.98, 19.34) 
dates <- seq(as.Date("2011-07-01"), by=1, len=length(prices)) 
ts.prices <- xts(prices, order.by =dates) 

covariance <- function(x, convert.to.vec=FALSE) { 
    if (convert.to.vec == TRUE) 
    x <- as.vector(x) 

    xbar <- mean(x) 
    N <- length(x) 
    i <- 1 
    covariance <- sum((x[1:(N-i)]-xbar)*(x[(1+i):N]-xbar)) 

    return(covariance) 
} 

Der Ausgang der covariance Funktion wird anders sein, ob convert.to.vec ist TRUE oder FALSE:

> covariance(ts.prices, TRUE) 
[1] -5.679376 
> covariance(ts.prices, FALSE) 
[1] 4.445328 

Nach dem Hinzufügen einiger Variablen und print s Debugging erleichtern den Code:

siehe

können wir, dass der Wert von term.3 ist derjenige, der verschieden ist:

> covariance(ts.prices, TRUE) 
[1] -2.264 -1.064 -0.584 -1.724 
[1] -1.064 -0.584 -1.724 5.636 
[1] 2.408896 0.621376 1.006816 -9.716464 
[1] -5.679376 
> covariance(ts.prices, FALSE) 
      [,1] 
2011-07-01 -2.264 
2011-07-02 -1.064 
2011-07-03 -0.584 
2011-07-04 -1.724 
      [,1] 
2011-07-02 -1.064 
2011-07-03 -0.584 
2011-07-04 -1.724 
2011-07-05 5.636 
       e1 
2011-07-02 1.132096 
2011-07-03 0.341056 
2011-07-04 2.972176 
[1] 4.445328 

Wenn convert.to.vecTRUE ist, term.3 enthält 4 Gleitkommazahlen, während es enthält 3 Gleitpunktzahlen wenn convert.to.vecFALSE ist. Also nehme ich an, dass der unterschiedliche Wert durch die Multiplikation zweier xts-Objekte mit zwei vektorisierten xts-Objekten verursacht wird. Warum ist das der Fall?

DC

+0

Ich glaube [Joshua's Antwort hier] (http://stackoverflow.com/a/10516245/2414948) ist relevant. 'Ops.xts' scheint' merge.xts' zu verwenden, um überlappende "Indizes" zu berücksichtigen, bevor eine arithmetische Operation stattfindet. –

+0

@alexis_laz Danke für den Link. Kannst du es als Antwort posten, damit ich es annehmen kann? – DivineComedy

+0

Ich bin mir der 'xts'-Dokumentation nicht ganz bewusst, also nicht sicher, wie man eine formale Antwort verfasst. Wenn die verknüpfte QA ausreichend ist, könnte es als Duplikat markiert werden –

Antwort

1

Basierend auf @ alexis_laz Kommentar, wenn eine Ops.xts Funktion wie + oder * auf zwei xts Objekte verwendet wird, werden beide Objekte zuerst miteinander verschmolzen, wenn ihre Indizes nicht identisch sind, wie wir sehen können, in xts`s sourcecode:

if(NROW(e1)==NROW(e2) && identical(.index(e1),.index(e2))) { 
    .Class <- "matrix" 
    NextMethod(.Generic) 
} else { 
    tmp.e1 <- merge.xts(e1, e2, all=FALSE, retclass=FALSE, retside=c(TRUE,FALSE)) 
    e2 <- merge.xts(e2, e1, all=FALSE, retclass=FALSE, retside=c(TRUE,FALSE)) 
    e1 <- tmp.e1 
    .Class <- "matrix" 
    NextMethod(.Generic) 
} 

in meinem Beispiel term.1 und term.2 haben nicht identischen Indizes, so werden beiden Objekte zusammengefasst, und die Ops Funktion * gibt ein Objekt zurück, das nur überlappende Daten enthält. Eine Lösung ist, coredata auf dem ursprünglichen x Objekt zu rufen.