Korelacja między macierzami w R

9

Mam problemy z korzystaniem z funkcji cor()i cor.test().

Mam tylko dwie macierze (tylko wartości liczbowe i taką samą liczbę wierszy i kolumn) i chcę mieć liczbę korelacji i odpowiednią wartość p.

Kiedy używam cor(matrix1, matrix2), otrzymuję współczynniki korelacji dla wszystkich komórek. Chcę tylko jedną liczbę w wyniku kore.

Dodatkowo, kiedy to zrobię, pojawia cor.test(matrix1, matrix2)się następujący błąd

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

Jak mogę uzyskać wartości p dla matryc?

Tutaj znajdziesz proste tabele, które chcę skorelować:

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

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

L_T
źródło
4
To jest trochę niejasne, czego chcesz. Kiedy mówisz, że chcesz tylko jeden wynik dla cor (macierz1, macierz2), czy próbujesz skorelować (wszystkie liczby w macierzy1) z (wszystkie liczby w macierzy2)? W takim przypadku możesz wypróbować cor (as.vector (matrix1), as.vector (matrix2))
Marius
Jaka jest dokładnie oczekiwana wartość p? (tj. jaką hipotezę testujesz?)
chl
Nie, chcę tylko skorelować dwie macierze, aby wiedzieć, jak bardzo są one podobne. Nie chcę porównania komórek po komórkach. Chcę w rezultacie pojedynczej liczby od 0 do 1, tak jak każda korelacja Pearsona używa dwóch wektorów na wejściu. Jakieś sugestie? Oczekiwana przeze mnie wartość p musi powiedzieć mi o znaczeniu korelacji.
L_T
1
Masz na myśli jak w cor(as.vector(matrix1), as.vector(matrix2))?
whuber

Odpowiedzi:

13

Jeśli chcesz po prostu obliczyć korelację między dwoma zestawami wartości, ignorując strukturę macierzy, możesz przekonwertować macierze na wektory za pomocą c(). Następnie twoja korelacja jest obliczana przez cor(c(matrix1), c(matrix2)).

Martin O'Leary
źródło
Używając twojej funkcji, otrzymuję następujący błąd: „Błąd w cor (c (macierz1), c (macierz2)):„ x ”musi być liczbą”. Ale jeśli
rzucisz
3
Problem R ten: read.csvktóry prawdopodobnie użyłeś, zwraca a, data.framektóre nie jest a matrix. Więc trzeba go przekonwertować do bycia matrixz as.matrixprzed czyni go jednym z długim wektorem c(), a otrzymane wyniki do cor. Tutaj jest w jednym wierszu:cor(c(as.matrix(matrix1)), c(as.matrix(matrix2)))
sprzężonyprzym
6

Nie powiedziałeś nic o tym, jakie są twoje dane. Niemniej jednak...

Załóżmy, że macierze mają kolumny reprezentujące dwa zestawy (różnych) zmiennych i (taką samą liczbę) wierszy reprezentujących przypadki.

Kanoniczna analiza korelacji

W tej sytuacji jedną potencjalnie interesującą bardziej uporządkowaną analizą korelacji jest znalezienie korelacji kanonicznych . Zakłada się, że chcesz podsumować związek między dwoma zestawami zmiennych pod względem korelacji między liniowymi kombinacjami matrix1kolumn i liniowymi kombinacjamimatrix2kolumny. I chciałbyś to zrobić, gdybyś podejrzewał, że istnieje przestrzeń o małych wymiarach, być może nawet 1, która ujawniłaby leżącą u podstaw strukturę korelacji między przypadkami, która jest zaciemniona przez ich realizację w obecnych układach współrzędnych zdefiniowanych przez zmienne. W związku z tym wartość tej (kanonicznej) korelacji w pewnym sensie podsumowałaby wielowymiarową liniową zależność między dwiema macierzami. Rzeczywiście, podczas gdy CCA działa dla macierzy o różnej liczbie zmiennych, redukuje się do korelacji Pearsona, gdy każda „macierz” jest tylko jedną kolumną.

Realizacja

Kanoniczna analiza korelacji jest opisana w większości tekstów analizy wielowymiarowej, co może być najbardziej pomocne, jeśli jesteś zadowolony z algebry macierzowej aż do analizy własnej. Jest zaimplementowany jak cancorw bazie R, a także w opisanym tutaj pakiecie CCA .

sprzężonyprior
źródło
Cześć, dzięki. Moje dane to proste dwie macierze zawierające te same zmienne. Struktura dwóch macierzy jest identyczna. Wartości w każdej komórce są wynikami eksperymentu, w którym zmienne te zostały ocenione w 9-punktowej skali Likerta i uśrednione dla wszystkich uczestników. Którą najlepszą strategią do znalezienia jest korelacja między dwiema matrycami? Czy potrafisz podać przykład w języku R?
L_T
1
Z podstawą R jest po prostu cancor(matrix1, matrix2).
conjugateprior
Ale może możesz trochę wyjaśnić. Zadzwoń . Czym jest ? Czy jest to odpowiedź tej osoby na -ty element Likerta? Na pewno nie. Skąd zatem bierze się średnia liczba uczestników? matrix1 AAijij
conjugateprior
Cześć, było 10 uczestników, musieli wyrazić „stopień spójności” pomiędzy parami bodźców (zauważ, że to nie jest eksperyment oceniający odmienność). Zrobiłem 2 eksperymenty. i chcę porównać wyniki w 2 warunkach eksperymentalnych. Każda komórka jest średnią ocen uczestników 1o dla każdej pary bodźców. Więc czy nadal powinienem używać Cancor?
L_T
Użyłem Cancora, ale nie otrzymuję ani jednej wartości współczynnika wyrażającej korelację, ani wartości p wyrażającej jej znaczenie. Proszę pomóż!
L_T
3

Jeśli luźno interpretujesz korelację jako podobieństwo, możesz użyć definicji opartej na produkcie wewnętrznym, takiej jak:

cAB=A,BA||Bgdzie iA,Btr(ABT)x||x,x1/2

Z twoich danych daje to 0,996672.

Alternatywą, jeśli struktura macierzy nie jest ważna, jest po prostu spłaszczenie macierzy do wektorów i użycie wybranej miary korelacji. Ponieważ nie znam dystrybucji danych, użyłem produktu kropkowego, aby uzyskać 0,976.

Z drugiej strony wydaje się, że Twoje dane są wysoce skorelowane.

Emre
źródło
Wydaje się, że współczynnik rv jest tym, o co poprosił PO: wartość między 0 a 1, która mówi o tym, jak podobne są obie macierze.
llrs