Correlazione tra matrici in R


9

Ho problemi nell'uso delle funzioni cor()e cor.test().

Ho solo due matrici (solo valori numerici e lo stesso numero di righe e colonne) e voglio avere il numero di correlazione e il corrispondente valore p.

Quando uso cor(matrix1, matrix2)ottengo i coefficienti di correlazione per tutte le celle. Voglio solo un singolo numero come risultato di cor.

Inoltre, quando lo faccio cor.test(matrix1, matrix2)ottengo il seguente errore

Error in cor.test.default(matrix1, matrix2) : 'x' must be a numeric vector

Come posso ottenere i valori p per le matrici?

Qui trovi le semplici tabelle che voglio correlare:

http://dl.dropbox.com/u/3288659/table_exp1_offline_MEANS.csv

http://dl.dropbox.com/u/3288659/table_exp2_offline_MEANS.csv


4
Non è chiaro quello che vuoi. Quando dici che vuoi solo un risultato per cor (matrix1, matrix2), stai cercando di correlare (tutti i numeri in matrix1) con (tutti i numeri in matrix2)? In tal caso, potresti provare cor (as.vector (matrix1), as.vector (matrix2))
Marius

Qual è il valore p che dovrebbe mostrare, precisamente? (cioè, quale ipotesi stai testando?)
chl

No, voglio solo correlare le due matrici per sapere quanto sono simili. Non voglio un confronto cella per cella. Voglio solo come risultato un singolo numero compreso tra 0 e 1, come ogni correlazione di Pearson utilizza due vettori in input. Qualche suggerimento? Il valore p che mi aspetto deve dirmi il significato della correlazione.
L_T

1
Intendi come in cor(as.vector(matrix1), as.vector(matrix2))?
whuber

Risposte:


12

Se vuoi semplicemente calcolare la correlazione tra i due insiemi di valori, ignorando la struttura della matrice, puoi convertire le matrici in vettori usando c(). Quindi la tua correlazione viene calcolata da cor(c(matrix1), c(matrix2)).


Usando la tua funzione ottengo questo errore: "Errore in cor (c (matrice1), c (matrice2)): 'x' deve essere numerico". Ma se dai una rapida occhiata ai miei tavoli, noti che contengono solo numeri ... Non capisco
L_T

3
Un problema R questo: read.csvche probabilmente hai usato, restituisce un data.frameche non è un matrix. Quindi è necessario convertirlo in un matrixcon as.matrixprima di renderlo un vettore lungo con c()e dare i risultati a cor. Eccolo in una riga:cor(c(as.matrix(matrix1)), c(as.matrix(matrix2)))
conjugateprior il

5

Non hai detto nulla su quali siano i tuoi dati. Tuttavia...

Supponiamo che le tue matrici abbiano colonne che rappresentano due insiemi di (diverse) variabili e (lo stesso numero di) righe che rappresentano i casi.

Analisi di correlazione canonica

In questa situazione, un'analisi di correlazione più strutturata potenzialmente interessante è quella di trovare le correlazioni canoniche . Ciò presuppone che si desideri riassumere la relazione tra i due insiemi di variabili in termini di correlazione (s) tra combinazioni lineari di matrix1colonne e combinazioni lineari dimatrix2colonne. E vorresti farlo se sospettassi che esistesse uno spazio di piccola dimensionalità, forse anche 1, che rivelerebbe una struttura di correlazione sottostante tra i casi che è oscurata dalla loro realizzazione negli attuali sistemi di coordinate definiti dalle variabili. Di conseguenza, il valore di questa correlazione (canonica) riassumerebbe, in un certo senso, una relazione lineare multivariata tra le due matrici. Infatti, mentre CCA lavora per matrici con diversi numeri di variabili, si riduce alla correlazione di Pearson quando ogni "matrice" è solo una singola colonna.

Implementazione

L'analisi della correlazione canonica è descritta nella maggior parte dei testi di analisi multivariata, il che è forse più utile se sei soddisfatto dell'algebra matriciale fino all'autovalisi. È implementato come cancornella base R e anche nel pacchetto CCA che è descritto qui .


Ciao grazie. I miei dati sono semplici due matrici contenenti le stesse variabili. La struttura delle due matrici è identica. I valori in ciascuna cella sono i risultati di un esperimento in cui tali variabili sono state valutate su una scala di Likert a 9 punti e mediate su tutti i partecipanti. Qual è la migliore strategia per trovare la correlazione tra le due matrici? Puoi fare un esempio in R?
L_T

1
Con la base R è solo cancor(matrix1, matrix2).
coniugato

matrix1 AAijij

Salve c'erano 10 partecipanti, hanno dovuto esprimere il "grado di coerenza" tra gli stimoli delle coppie (si noti che non si tratta di un esperimento di valutazione di dissomiglianza). Ho fatto 2 esperimenti. e voglio confrontare i risultati nelle 2 condizioni espdrimentali. Ogni cellula è la media delle valutazioni dei 1o partecipanti per ciascuna coppia di stimoli. Quindi dovrei ancora usare il cancro?
L_T

Ho usato il cancro, ma non ottengo un singolo valore di coefficiente che esprima la correlazione né un valore di p che ne esprima il significato. Per favore aiuto!
L_T

3

Se si definisce vagamente la correlazione per significare somiglianza, è possibile utilizzare una definizione basata sul prodotto interno, come ad esempio:

cAB=A,BA||Bx | | x , x 1 / 2A,Btr(ABT)x||x,x1/2

Con i tuoi dati questo produce 0.996672.

L'alternativa, se la struttura della matrice non è importante, è semplicemente appiattire le matrici in vettori e utilizzare la misura di correlazione scelta. Dato che non conosco la distribuzione dei tuoi dati, ho usato il prodotto dot per ottenere 0,976.

Ad ogni modo, sembra che i tuoi dati siano altamente correlati.


Questo sembra il coefficiente rv , che è quello che l'OP ha chiesto: un valore compreso tra 0 e 1 che indica quanto siano simili entrambe le matrici.
ll
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.