2015-04-16 1 views
3

произошла ошибка меня, когда я пытался сделать следующую работу:Ошибка с XTS :: применяются: «Ошибка в coredata.xts (х): в настоящее время не поддерживается тип данных»

# generate random integrals # 
data <- xts(floor(runif(100, 1,101)),as.Date("1973-02-01") + c(1:100) - 1) 
apply.monthly(data, diff,1,1) 

, в то время как это один работает:

apply.monthly(data,mean)

Я проверил опубликовал подобные вопросы, но, похоже, они не относятся к ситуации здесь.

Любые советы?


Некоторые дополнительные разъяснения:

Причина мне нужно это, что я получил время данные серии набор как следующий,

1990-05 100 
1990-04 80 
1990-03 60 
1990-02 20 
1990-01 5 
1989-12 110 
1989-11 89 
1989-10 78 
... 

В каждом году, y(t)=y_(t-1)+dy, где dt изменение стоимости в периоде t. Но эта закономерность происходит только каждый год и каждый год отдельно. Поэтому в основном я хочу, чтобы получить разницу между каждым месяцем в каждый конкретный год, то есть:

1990-05 20 #100-80 
1990-04 20 #80-60 
1990-03 40 #60-20 
1990-02 15 #20-5 
1990-01 5 #5 
1989-12 21 #110-89 
1989-11 11 #89-78 
... 

Надежда Я сделал объяснение достаточно ясным.

Спасибо,

ответ

4

apply.monthly и period.apply используется для агрегирования данных в указанный период. diff не работает, потому что diff.xts возвращает вектор такой же длины, как и вход. mean работает, потому что он возвращает одно значение для заданного входного вектора.

Мне непонятно, чего вы ожидаете apply.monthly(data, diff). Это будет то же самое, что и вызов diff(data), а затем добавление NA к первому значению каждого месяца.


С вашим редактированием я теперь понимаю, что вы пытаетесь сделать. Вы хотите различия, но вы хотите, чтобы январь каждого года был уровнем за этот месяц, а не разницей с декабрем предыдущего года.

Вот один из способов сделать это:

# Load your data as an example 
Lines <- 
"1990-05 100 
1990-04 80 
1990-03 60 
1990-02 20 
1990-01 5 
1989-12 110 
1989-11 89 
1989-10 78" 
con <- textConnection(Lines) 
# Ensure the timezone of your non-intraday xts object is UTC, 
# or bad things can happen 
x <- as.xts(read.zoo(con, FUN=as.yearmon), tzone="UTC") 
close(con) 

# Create a helper function 
f <- function(x) { 
    y <- diff(x) 
    if (.indexmon(y)[1] == 0) 
    y[1] <- x[1] 
    y 
} 
# apply the function to each year subset and rbind the results 
do.call(rbind, lapply(split(x,'years'), f)) 

Вот еще один способ, который вы могли бы найти более привлекательным.

colnames(x) <- "level" 
# calculate all differences 
x$diff <- diff(x$level) 
# set January differences to their respective level 
jan <- .indexmon(x) == 0 
x[jan, "diff"] <- x[jan, "level"] 
+0

Спасибо за ваш ответ. Это вполне разумно. Более подробное объяснение добавляет, почему мне нужно делать apply.monthly (данные, diff). –

+0

@ L.J: Я обратился к вашему редактированию. –

Смежные вопросы