2017-05-12 2 views
0

Ich habe eine einfache Korrelationsfunktion geschrieben, die drei Variablen aufnimmt. "A" und "B" sind numerische Vektoren gleicher Länge und "n" ist die Länge.Wie laufen alle "N take 2" Iterationen einer Funktion?

Corr.fxn <- function(A, B, n){ 
Correlation <- (sum((A - mean(A))*(B - mean(B)))/(n-1))/(sd(A)*sd(B)) 
return(Correlation) 
} 

Die Funktion funktioniert gut genug, aber ich habe viele Vektoren, die ich verarbeiten möchte. Was ist der beste Weg, um diesen Code zu ändern, um alle "N Take 2" eindeutige Analysen für meine Menge von Vektoren "N" zu verarbeiten?

EDIT:

Beispiel Daten, die die Struktur der Vektoren zeigt:

A <- c(-1, 0, 1, -1, 0, 1, -1, 0, 1) 
B <- c(1, 1, -1, 0, 1, -1, 0, 0, 1) 
... 
n <- length(A) 

Also lassen Sie uns sagen, ich habe Vektoren A bis Z und ich möchte meinen Code zur Ausgabe eines neuen Vektor mit allen ändern { 26 nimm 2} Korrelationswerte.

+1

Wie sind die Vektoren organisiert? Es wird nützlich sein, einige Beispiel-Eingabedaten zu erstellen und zu veröffentlichen. – Gopala

+0

'apply (combn (N, 2), 2, Corr.fxn)'? Wenn "N" eine Liste ist, indizieren Sie sie stattdessen. – alistaire

+0

* "N take 2" * erinnert mich an ['combn'' (https://stat.ethz.ch/R-manual/R-devel/library/utils/html/combn.html). Wenn Sie etwas wie "combn (N, 2, simplify = FALSE)" tun, erhalten Sie eine Liste, in der jedes Element eine Liste von zwei Ihrer 'N' Vektoren ist. Versuchen Sie 'combn (list (1: 2, 3: 4, 5: 6), 2, simply = FALSE)' als Beispiel. (Du hast mich geschlagen, Alistaire ...) – r2evans

Antwort

1

Hier ist eine mögliche Art und Weise Sie es tun können, vorausgesetzt, Sie eine Reihe von numerischen Vektoren in einer Liste haben v wie folgt:

v <- list() 
for (i in 1:10) { 
    v[[i]] <- sample(1:10, 10, replace = TRUE) 
} 

apply(combn(1:10, 2), 2, function(x) Corr.fxn(v[[x[1]]], v[[x[2]]], length(v[[x[1]]]))) 
0

In dieser Antwort, nehme ich an zwei Dinge. Zuerst möchten Sie eine Funktion selbst schreiben, da Sie sonst Hmisc::rcorr verwenden können. Zweitens, Sie möchten, dass der Teil "N take 2" in der Funktion enthalten ist, ansonsten sind die zuvor vorgeschlagenen Möglichkeiten korrekt. In diesem Fall können Sie dies tun:

Corr.fxn <- function(vectors, n){ 
    pairs<- combn(length(vectors), 2) 
    npairs<- ncol(pairs) 
    cor.mat<- matrix(NA, nrow = length(vectors), ncol = npairs) 
    for (i in 1:ncol(pairs)){ 
     A<- vectors[[pairs[1, i]]] 
     B<- vectors[[pairs[2, i]]] 
    cor.mat[pairs[1, i], pairs[2, i]] <- (sum((A - mean(A))*(B - mean(B)))/(n-1)) /(sd(A)*sd(B)) 
    } 
    cor.mat[lower.tri(cor.mat)]<- cor.mat[upper.tri(cor.mat)] ### 
    diag(cor.mat)<- 1 ### 
    cor.mat<- data.frame(cor.mat) ### 
    row.names(cor.mat)<- colnames(cor.mat)<- names(vectors) ### 
    return(cor.mat) 
} 

Die Linien, die in ### Ende gibt es aus dekorativen Gründen. Die Haupteingabe ist eine Liste, die "Vektoren" genannt wird. So funktioniert es wie folgt:

A<- runif(100, 1, 100) 
B<- runif(100, 30, 50) 
C<- runif(100, 120, 200) 
> Corr.fxn(list(A=A, B=B, C=C), n=100) 
      A   B   C 
A 1.0000000 -0.11800104 -0.13980458 
B -0.1180010 1.00000000 0.04933581 
C -0.1398046 0.04933581 1.00000000 
Verwandte Themen