1
votes

Réorganiser la matrice de corrélation dans R pour obtenir des 1 sur les diagnostics

J'ai une matrice de corrélation qui s'est un peu brouillée. Les 1 ne sont pas à leur place. Je voudrais remettre les 1 sur les diagonales.

La matrice réelle est 1k x 1k mais voici un exemple.

    QQQ       SPY       IWM       ticker
1 1.0000000 0.7936952 0.6107246    QQQ
2 0.7936952 1.0000000 0.6995408    SPY
3 0.6107246 0.6995408 1.0000000    IWM

Je voudrais que la sortie soit:

mat = structure(list(QQQ = c(0.61072455, 1, 0.793695176), SPY = c(0.699540765, 
0.793695176, 1), IWM = c(1, 0.61072455, 0.699540765), ticker = c("IWM", 
"QQQ", "SPY")), row.names = c(NA, -3L), class = "data.frame")

print(mat)

        QQQ       SPY       IWM ticker
1 0.6107246 0.6995408 1.0000000    IWM
2 1.0000000 0.7936952 0.6107246    QQQ
3 0.7936952 1.0000000 0.6995408    SPY


0 commentaires

3 Réponses :


2
votes

Vous souhaitez organiser les lignes de la même manière que les colonnes. Utilisation de dplyr:

        QQQ       SPY       IWM ticker order
1 1.0000000 0.7936952 0.6107246    QQQ     1
2 0.7936952 1.0000000 0.6995408    SPY     2
3 0.6107246 0.6995408 1.0000000    IWM     3

Sortie (évidemment, vous pouvez maintenant supprimer la colonne order ):

mat %>%
    mutate(order = match(ticker, colnames(mat))) %>%
    arrange(order)


1 commentaires

Marius Merci pour votre contribution !! J'ai décidé de suivre la réponse d'Akrun simplement parce que je n'ai pas à abandonner la colonne. Mais c'était super utile. Merci d'utiliser dplyr!



2
votes

Nous pouvons utiliser match dans base R

mat[order(match(mat$ticker, names(mat))),]
#       QQQ       SPY       IWM ticker
#2 1.0000000 0.7936952 0.6107246    QQQ
#3 0.7936952 1.0000000 0.6995408    SPY
#1 0.6107246 0.6995408 1.0000000    IWM


1 commentaires

mat [ c (mat $ ticker, "ticker")]



1
votes

Une option serait de rechercher l'index de colonne où 1 apparaît pour chaque ligne, quelque chose comme:

ind = apply(mat[, 1:3], 1, function (x) which (x == 1)

Ce qui vous donnera un vecteur d'index de colonne où le 1 se produit. Ensuite, réorganisez les lignes de la matrice par index de colonne (croissant):

mat[order (ind), ]

Je suis sur mobile, je n'ai donc pas testé cela.

Modifier vous utilisez un bloc de données, pas une matrice. Le même principe s'applique mais vous devez exclure la colonne "ticker" dans votre instruction apply :

ind = apply(mat, 1, function (x) which (x == 1)

Pour être encore plus sûr, utilisez near ou all.equal au lieu de == , vous devriez généralement éviter de tester l'égalité des nombres à virgule flottante (bien que cela fonctionne souvent bien dans R). p>


2 commentaires

S'il existe d'autres corrélations de 1, cette approche deviendra problématique.


@elin vrai, mais ensuite je me demande quelle logique a été utilisée pour construire la colonne "ticker" en premier lieu puisque le même problème serait en jeu.