不确定 do.call() 在 R 中在做啥

Posted

技术标签:

【中文标题】不确定 do.call() 在 R 中在做啥【英文标题】:Not sure what do.call() is doing here in R不确定 do.call() 在 R 中在做什么 【发布时间】: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 然后发布一个测试用例。 【参考方案1】:

首先,如果你想要一个相关矩阵,你不必跳过所有这些火热的圈子(至少在 R 中不是)。

cor(Master[,-1],use="pairwise.complete.obs",method="pearson")

会为你做 - 例如如果你将一个矩阵传递给cor(...),你会得到一个每一列与其他每一列的相关矩阵。在这里,我们将传递除第一列之外的所有列。这也与您使用do.call(...) 得到意外结果的原因有关。

你的论点:

list(names(Master)[-1])

是一个包含一个元素的列表,包含所有名称的向量。所以你的表情:

do.call(function(X) ..., list(names(Master)[-1]))

基本上将包含所有相关列名的向量传递给您的函数,然后将其传递给cor(...)

cor(Master[,names(Master)[-1]],Master[,names(Master)[-1]],...)

依次计算完整的相关矩阵。

最后一点。表达式:

as.list(names(Master)[-1])

创建一个包含ncol(Master)-1 元素的列表,每个元素都包含一列的名称。在do.call(...) 中使用它会引发错误,因为您的函数未设置为采用参数列表。

【讨论】:

谢谢!非常感谢您的反馈,我没有意识到我只需要一个用于 cor() 的数据参数 不客气。由于您是 SO 新手,请read this.

以上是关于不确定 do.call() 在 R 中在做啥的主要内容,如果未能解决你的问题,请参考以下文章

调试这个 LISP 病毒在做啥

在 ViewSwitcher 中在不确定的 ProgressBar 和 Image 之间切换

??!??! 是啥意思?运算符在 C 中做啥?

这个条件运算符是做啥的? [复制]

R语言do.call函数和call函数实战

合并多个data.tables