【发布时间】:2014-08-28 15:53:33
【问题描述】:
所以我是 R 新手,我正在尝试通过避免 for 循环来构建相关矩阵。我在网上到处搜索,我似乎无法弄清楚 do.call() 在我的特定情况下在做什么。你们中的一些人可能会建议我尝试 lapply 或 sapply ,但是在这里我只想了解为什么 do.call() 有效。
我最初的方法如下,简单且次优: (Master是一个带有价格数据的data.frame,第一列是Date,这就是我排除它的原因。)
for(i in 1:length(names(Master)[-1]))
{
for(j in 1:length(names(Master)[-1]))
{
MasterVCV[i,j] <- cor(Master[,1+i],Master[,1+j],use="pairwise.complete.obs",method="pearson")
}
}
但是,由于某种我无法弄清楚的原因,这也有效:
matrix(
data=do.call(function(X){cor(Master[,as.character(X)],Master[,as.character(X)],use="pairwise.complete.obs",method="pearson")},list(names(Master)[-1]))
,nrow=length(names(Master)[-1])
,ncol=length(names(Master)[-1])
,dimnames=list(names(Master)[-1],names(Master)[-1])
)
当我只传递一个列表时,我不确定它为什么/如何构建对来创建方矩阵。我的猜测是它在索引中进行交叉连接,但我在任何地方都找不到任何文档。任何帮助/反馈将不胜感激。如果需要任何其他详细信息,请告诉我。
谢谢,
编辑:添加了测试用例(我希望这有效并且是适当的格式) - 数据是从 quandl 下载的
library(quantmod)
library(Quandl)
FFFactors <- Quandl("KFRENCH/FACTORS_D",type = "raw", start_date="2001-01-01", end_date = "2010-01-01")
MOM <- Quandl("KFRENCH/MOMENTUM_D",type = "raw", start_date="2001-01-01", end_date = "2010-01-01")
FFFactors<-data.frame(Date=FFFactors[,1],sapply(FFFactors[,-1],function(X){X/100}))
MOM<-data.frame(Date=MOM[,1],MOM=MOM[,length(MOM)]/100)
Master<-merge(FFFactors,MOM,by.x="Date",by.y="Date",all.x=TRUE,all.y=TRUE)
#Recode and clean
Master$Curve[Master$Curve==Inf]<-NA
Master$Curve[Master$Curve==-Inf]<-NA
Master$Curve[Master$Curve==NaN]<-NA
##########ALTERNATIVE VCV CALC#############
MasterVCV2<-
matrix(
data=do.call(function(X){cor(Master[,as.character(X)],Master[,as.character(X)],use="pairwise.complete.obs",method="pearson")},list(names(Master)[-1]))
,nrow=length(names(Master)[-1])
,ncol=length(names(Master)[-1])
,dimnames=list(names(Master)[-1],names(Master)[-1])
)
#dimension VCV and create it
MasterVCV<-matrix(nrow=length(names(Master)[-1]),ncol=length(names(Master)[-1]),dimnames=list(names(Master)[-1],names(Master)[-1]))
for(i in 1:length(names(Master)[-1]))
{
for(j in 1:length(names(Master)[-1]))
{
MasterVCV[i,j] <- cor(Master[,1+i],Master[,1+j],use="pairwise.complete.obs",method="pearson")
}
}
identical(MasterVCV,MasterVCV2)
【问题讨论】:
-
你确定那些给你相同的结果吗?如果在两个不同的输出上运行
identical(.,.)会发生什么? -
它们实际上是(抱歉,我仍在尝试评论)....> 相同(MasterVCV,MasterVCV2)[1] TRUE
-
然后发布一个测试用例。
标签: r