2016-05-29 7 views
0

Jede Hilfe mit dem folgenden Problem würde sehr geschätzt werden;pearsons Koeffizient zwischen den Reihen R

Ich versuche R zu verwenden, um den Pearsons-Koeffizienten zwischen 1 bestimmten Datenreihe mit jeder anderen Zeile in einem Datensatz (separat) zu finden, um zu bestimmen, welche Zeilen eine signifikante Korrelation mit der Zeile von Interesse haben. Der Datenrahmen besteht aus 20 Spalten und 50.000 Zeilen, die Daten selbst bestehen aus Zahlenwerten. Kann der Cor.test oder eine andere geeignete Funktion so angewendet werden, um dies zu erreichen?

Antwort

2

Zuerst empfehle ich, Ihr Eingabeobjekt als Matrix und nicht als Datenrahmen neu zu formatieren.

Sie können apply() verwenden, um über alle Zeilen der Matrix zu iterieren und cor() zwischen der aktuellen Zeile und der Zeile von Interesse ausführen. Dies wird einen Vektor von Korrelationen erzeugen. Im folgenden Code erzeuge ich eine Zufallsmatrix m mit 20 Spalten und 50.000 Zeilen und speichere die interessierende Zeile in ri. Dann können wir apply() mit Zeilenrand aufrufen (also MARGIN=1L), um cor() auf jeder Zeile gegen die Zeile von Interesse m[ri,] zu rufen.

Sie können auswählen, ob die für die Iteration interessante Zeile ein- oder ausgeschlossen werden soll. In meinem Codebeispiel unten schließe ich es ein, was dazu führt, dass ein Element garantiert den Wert 1 bei Index ri im Ergebnisvektor res hat. Ein schöner Nebeneffekt dieser Wahl ist, dass der Ergebnisvektor die Länge 50.000 hat, genau wie die Anzahl der Zeilen in der Eingabematrix, und somit werden die Indizes ausgerichtet. Wenn Sie sich dafür entscheiden, es auszuschließen, indem Sie m[-ri,] an den apply() Aufruf statt nur an m übergeben, wird der Ergebnisvektor Länge 49,999 haben, und seine Elemente werden nicht mehr mit den Zeilen der Eingabematrix ausgerichtet.

NR <- 50e3L; NC <- 20L; m <- matrix(runif(NR*NC),NR); 
ri <- 2L; res <- apply(m,1L,cor,m[ri,]); 
str(res); 
## num [1:50000] -0.074 1 0.201 -0.0467 0.2097 ... 
summary(res); 
##  Min. 1st Qu. Median  Mean 3rd Qu.  Max. 
## -0.806700 -0.158500 0.001143 0.001114 0.160800 1.000000 

Sie können cor() mit cor.test() ersetzen durch diese bereitgestellt, um die zusätzliche Informationen zu erhalten, aber auf Kosten von etwas längeren Laufzeit und ein komplexere Ergebnisobjekt (eine Liste anstelle einem Atomvektor).

+0

vielen Dank das funktioniert. Könnten Sie vielleicht vorschlagen, wie ich die Ergebnisse in ein Excel-Blatt ausgeben könnte? Ich habe versucht, Dinge wie pvalues ​​<- res $ p.value, res $ "p.value" usw. zu verwenden und NULL Nachrichten zu erhalten. – user5688971

+0

Wenn Sie fragen, wie Sie die P-Werte aus der Liste der Ergebnisse von 'cor.test()' extrahieren, können Sie 'pvalues ​​<- sapply (res, '[[', 'p.value')] verwenden. Wenn Sie fragen, wie Sie Daten von R nach Excel exportieren, würde ich Ihnen eine [Google-Suche] empfehlen (https://www.google.ca/search?q=export+r+to+excel). Wenn keines der Google-Ergebnisse für Ihren Anwendungsfall geeignet ist, würde ich vorschlagen, eine neue Frage zu Stack Overflow zu stellen. – bgoldst

+0

danke, das funktioniert perfekt – user5688971

1

Eine alternative Lösung wäre, zuerst Ihre data.frame zu transponieren, und dann könnten Sie ein Korrelogramm verwenden, um die Korrelationen zu visualisieren.

# transpose data 
    df2 <- data.frame(t(df)) 


# Example of a correlogram using the `mtcars` dataset: 
    library(corrgram) 

    corrgram(mtcars, order=NULL, lower.panel=panel.shade, 
      upper.panel=NULL, text.panel=panel.txt, 
      main="your correlogram") 

enter image description here

Verwandte Themen