Фильтр корреляционной матрицы R - PullRequest
0 голосов
/ 03 ноября 2018

Я немного застрял, пытаясь извлечь данные из корреляционной матрицы, я ищу извлечения значений, которые выше 0,8 и ниже 0,99, поскольку я хочу исключить корреляцию двух акций, которые точно равны 1.

это мой код:

  #Test 

#load the packages
library(corrr)
library(ggplot2)
library(ggcorrplot)
library(dplyr)
library(quantmod)

#get the data needed
startdate <- "2001-01-03"

tickers <- c("MMM", "AA", "AXP", "T", "BAC")
portfolioprices <- NULL

for(ticker in tickers)
  portfolioprices <- cbind(portfolioprices, getSymbols(ticker, from=startdate, auto.assign=F)[,4])
colnames(portfolioprices) <- tickers

#check if there is nothing wrong with the data
print(portfolioprices)

#create a correlation matrix and plot it
correlations <- cor(as.matrix(portfolioprices))
correlations <- as.data.frame(correlations)
correlations
ggcorrplot(correlations, hc.order = TRUE, type = "lower",
           lab = TRUE)

в качестве вывода я получаю:

           MMM          AA        AXP           T        BAC
MMM  1.0000000 -0.40325223  0.8772498  0.39019025 -0.2406640
AA  -0.4032522  1.00000000 -0.3029517  0.06347736  0.8383226
AXP  0.8772498 -0.30295171  1.0000000  0.41189453 -0.1304659
T    0.3901902  0.06347736  0.4118945  1.00000000 -0.1297723
BAC -0.2406640  0.83832262 -0.1304659 -0.12977234  1.0000000

Это фрейм данных, в котором я бы в идеале извлек данные, которые положительно коррелируют с минимальным значением 0,8.

Я не знаю, правильно ли я поступаю по этому поводу или нет, и любые отзывы приветствуются!

РЕДАКТИРОВАТЬ:

В идеале я бы предпочел, чтобы данные выглядели так:

          MMM          AA        AXP           T        BAC
MMM                          0.8772498  
AA                                                  0.8383226
AXP  0.8772498 
T    
BAC               0.83832262 

Где будут фильтроваться только соответствующие положительные значения. Удаление неидентичных значений.

МММ: AXP = 0,8772498 BAC: AA = 0,8382262

Если это вообще возможно.

Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Просто добавьте эту строку в конце вашего кода

correlations[correlations < 0.8 | correlations ==1] <- ""

Надеюсь, это поможет!

0 голосов
/ 04 ноября 2018

Загрузите ваши данные, чтобы другим было легко воспроизвести ваши результаты:

dat <- structure(list(MMM = c(1, -0.4032522, 0.8772498, 0.3901902, -0.240664
), AA = c(-0.40325223, 1, -0.30295171, 0.06347736, 0.83832262
), AXP = c(0.8772498, -0.3029517, 1, 0.4118945, -0.1304659), 
T = c(0.39019025, 0.06347736, 0.41189453, 1, -0.12977234), 
BAC = c(-0.240664, 0.8383226, -0.1304659, -0.1297723, 1)), 
.Names = c("MMM", "AA", "AXP", "T", "BAC"), 
class = "data.frame", 
row.names = c("MMM", "AA", "AXP", "T", "BAC"))

Теперь просто получите индекс и используйте подмножество в именах матрицы.

index <- which(abs(dat) > .80 & abs(dat) < 1, # your criteria
               arr.ind = T) # the result of the which function is now in rows & columns
cbind.data.frame(stock1 = rownames(dat)[index[,1]], # get the row name 
                 stock2 = colnames(dat)[index[,2]]) # get the column name
#      stock1 stock2
#1    AXP    MMM
#2    BAC     AA
#3    MMM    AXP
#4     AA    BAC

** Я предположил, что вам нужна высокая абсолютная корреляция (для предсказуемости) - но если вам нужны только акции, которые движутся в тандеме в одном направлении , просто удалите функции abs.

...