Итак, я новичок в R, и я пытаюсь построить корреляционную матрицу, избегая for-loops. Я ищу везде в Интернете, и я не могу понять, что делает do.call() в моем конкретном случае. Некоторые из вас могут предположить, что я стараюсь использовать или использовать вместо этого, но здесь я просто хотел бы понять, почему работает do.call().Не знаете, что делает do.call() здесь в R
Мой первоначальный подход был следующим, легко и неоптимальной: (. Master является data.frame с ценовым данным, с первого столбца, даты, поэтому я исключаю)
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])
)
Я не знаю, почему/как они строят пары, чтобы создать квадратную матрицу, когда я только проходящий один список , Я предполагаю, что это делает перекрестное соединение индексов, но я не могу найти никакой документации нигде. Любая помощь/обратная связь будут очень оценены. Пожалуйста, дайте мне знать, если требуются какие-либо другие детали.
Спасибо,
EDIT: тест добавил (я надеюсь, что это работает и соответствующий формат) - данные загружаются из 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)
Вы уверены, что предоставили вам эквивалентные результаты? Что произойдет, если вы запустите 'same (.,.)' На двух разных выходах? –
они на самом деле (извинения, я все еще пытаюсь понять, комментируя) ....> идентичные (MasterVCV, MasterVCV2) [1] TRUE – user3814629
Затем отправьте тестовый пример. –