2016-08-07 2 views
2

I은 ​​covariance 함수의 출력은 convert.to.vec인지 다를 것이다다른 결과는 개체

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) 
} 

다음 원래의 코드가 TRUE 또는 FALSE :

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

일부 변수를 추가하고 print을 추가하면 코드를 쉽게 디버깅 할 수 있습니다.

FALSE 될 때 3 개 부동 번호가 포함 반면

> 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 

convert.to.vecTRUE이다 term.3, 4 개 플로팅 번호가 포함 23,259,247,539,253,210

우리 term.3의 값이 다른 하나 인 것을 알 수있다. 그래서 다른 값은 두 개의 xts 객체와 두 개의 vector'ed xts 객체의 곱셈에 의해 발생한다고 가정합니다. 왜 이런 경우입니까? 자신의 인덱스가 동일하지 않은 경우 우리가 볼 수있는 등 + 또는 * 같은 Ops.xts 함수는 두 개의 xts 객체에 사용되는 @ alexis_laz의 의견에 기초

DC

+0

[Joshua의 대답은 여기에 있습니다.] (http://stackoverflow.com/a/10516245/2414948)와 관련이 있습니다. 'Ops.xts'는 산술 연산이 일어나기 전에 겹치는 "인덱스"를 설명하기 위해 merge.xts를 사용하는 것으로 보입니다. –

+0

@alexis_laz 링크를 제공해 주셔서 감사합니다. 수락 할 수 있도록 답으로 게시 할 수 있습니까? – DivineComedy

+0

필자는'xts' 문서를 완전히 알지 못하므로 공식적인 답을 작성하는 방법을 모릅니다. 링크 된 품질 관리가 충분하다면 중복으로 표시 될 수 있습니다. –

답변

1

는 두 개체는 첫째, 서로 병합 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) 
} 

, term.1term.2 따라서 두 객체가 병합하지 동일 인덱스를 가지고 있고, Ops 기능은 겹치는 날짜 만 포함하는 객체를 반환합니다. 한 가지 해결책은 원래 x 개체에서 coredata으로 전화하는 것입니다.