2014-07-08 1 views
0

Итак, я новичок в 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) 
+0

Вы уверены, что предоставили вам эквивалентные результаты? Что произойдет, если вы запустите 'same (.,.)' На двух разных выходах? –

+0

они на самом деле (извинения, я все еще пытаюсь понять, комментируя) ....> идентичные (MasterVCV, MasterVCV2) [1] TRUE – user3814629

+0

Затем отправьте тестовый пример. –

ответ

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(...) вызовет ошибку, потому что ваша функция не настроена на выбор списка аргументов.

+0

спасибо!Я действительно ценю ваши отзывы, я не понимал, что мне нужен только один аргумент данных для cor() – user3814629

+0

. Добро пожаловать. Поскольку вы новичок в SO, пожалуйста, прочитайте это (http://stackoverflow.com/help/no-one-answers). – jlhoward

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