#r #xts
#r #xts
Вопрос:
Я работаю над кодом R для реализации кривой доходности для различных казначейских облигаций США. Вот мои коды: (формулировки проблемы следуют в конце кода)
library(quantmod)
t3mo=getSymbols("DGS3MO",src="FRED",auto.assign = FALSE)
t6mo=getSymbols("DGS6MO",src="FRED",auto.assign = FALSE)
t1yr=getSymbols("DGS1",src="FRED",auto.assign = FALSE)
t2yr=getSymbols("DGS2",src="FRED",auto.assign = FALSE)
t3yr=getSymbols("DGS3",src="FRED",auto.assign = FALSE)
t5yr=getSymbols("DGS5",src="FRED",auto.assign = FALSE)
t7yr=getSymbols("DGS7",src="FRED",auto.assign = FALSE)
t10yr=getSymbols("DGS10",src="FRED",auto.assign = FALSE)
t20yr=getSymbols("DGS20",src="FRED",auto.assign = FALSE)
t30yr=getSymbols("DGS30",src="FRED",auto.assign = FALSE)
# Combine the yield data into one object
treasury=merge(t3mo ,t6mo ,t1yr ,t2yr ,t3yr ,t5yr ,t7yr ,t10y) ,t20yr ,t30yr)
treasury[c(1:3,nrow(treasury)),]
# subset to include the yield from 1990-2013
extreme=subset(treasury, index(treasury)>="1990-01-01" amp; index(treasury)<="2013-12-31")
extreme=extreme[,c(1,8,10)]
extreme=na.omit(extreme)
# Identify examples of different shapes of the yield curve
extreme$sign.diff=extreme$DGS30-extreme$DGS3MO
extreme$inverted=ifelse(extreme$sign.diff==min(extreme$sign.diff),1,0)
# inverted: 30 year yield<3 month yield
inverted=subset(extreme,extreme$inverted==1)
extreme$upward=ifelse(extreme$sign.diff==max(extreme$sign.diff),1,0)
# upward normal: 30 year yield>3 month yield
upward=subset(extreme,extreme$upward==1)
extreme$abs.diff=abs(extreme$DGS30 - extreme$DGS3MO)
extreme$flat=ifelse(extreme$abs.diff==min(extreme$abs.diff),1,0)
# maybe the flat yield curve or the humpback yield curve
flat=subset(extreme,extreme$flat==1)
# compare 30-year yield to 10-year yield to find
# the flattest curves within the set of flat curves above
flat$abs.diff2=abs(flat$DGS30-flat$DGS10)
flat$flat2=ifelse(flat$abs.diff2==min(flat$abs.diff2),1,0)
flat$flat2==1
# WHY DOES THIS NOT WORK, GIVEN "flat" IS THE SAME AS THE VARIABLE "extreme"???**
flat2=subset(flat,flat$flat2==1)
class(flat); class(extreme)
is.recursive(extreme)
is.recursive(flat)
Вот в чем проблема: extreme
является xts и атомарным (не рекурсивным). flat
является подмножеством из extreme
. flat
также является xts и атомарным (не рекурсивным). Я могу получить доступ к столбцам как в, так extreme
и flat
с помощью $
operator . Однако, хотя я могу подмножество extreme
с помощью $
operator , я не могу этого сделать с flat
помощью and R возвращает сообщение об ошибке как:
Ошибка в flat $ flat2: $ operator недопустим для атомарных векторов
Я понятия не имею, почему R указывает на эту ошибку. flat$flat2==1
работает автономно, но не работает, когда стоит в subset()
функции? Выполняет ли R разные процедуры?
Ответ №1:
subset
использует нестандартную оценку своих аргументов. Вы повторно указываете имя объекта в subset
аргументе. Разница с flat
объектом заключается в том, что flat
это имя объекта и имя столбца в объекте, и именно это вызывает проблему.
Вот простой пример, который иллюстрирует проблему:
R> x <- xts(cbind(x=1, y=2), as.Date("2016-09-27"))
R> subset(x, x$x == 1)
Error in x$x : $ operator is invalid for atomic vectors
R> subset(x, x == 1)
x y
2016-09-27 1 2
Кроме того, вот более краткая версия вашего кода, которая позволяет избежать subset
всего вместе:
library(quantmod)
e <- new.env()
symbols <- c("DGS3MO","DGS6MO","DGS1","DGS2","DGS3",
"DGS5","DGS7","DGS10","DGS20","DGS30")
getSymbols(symbols, src="FRED", env=e)
# Combine the yield data into one object
treasury <- do.call(merge, as.list(e))[,symbols]
# subset to include the yield from 1990-2013
extreme <- na.omit(treasury["1990/2013"])
# Identify examples of different shapes of the yield curve
extreme$sign.diff <- extreme$DGS30 - extreme$DGS3MO
extreme$inverted <- extreme$sign.diff == min(extreme$sign.diff)
# inverted: 30 year yield<3 month yield
inverted <- extreme[extreme$inverted == 1,]
extreme$upward <- extreme$sign.diff == max(extreme$sign.diff)
# upward normal: 30 year yield>3 month yield
upward <- extreme[extreme$upward == 1,]
extreme$abs.diff<- abs(extreme$DGS30 - extreme$DGS3MO)
extreme$flat <- extreme$abs.diff == min(extreme$abs.diff)
# maybe the flat yield curve or the humpback yield curve
flat <- extreme[extreme$flat == 1,]
# compare 30-year yield to 10-year yield to find
# the flattest curves within the set of flat curves above
flat$abs.diff2 <- abs(flat$DGS30 - flat$DGS10)
flat$flat2 <- flat$abs.diff2 == min(flat$abs.diff2)
flat2 <- flat[flat$flat2 == 1,]
Комментарии:
1. Большое спасибо за вашу помощь, Ульрих. Теперь я понимаю причины. Ваши коды также являются хорошим учебным примером для меня. Лучшие.