आर

2012-01-09 6 views
8

में समूह द्वारा spearman सहसंबंध, आप आर में समूह द्वारा स्पीरमैन सहसंबंध की गणना कैसे करते हैं। मुझे निम्नलिखित लिंक को समूह द्वारा पियरसन सहसंबंध के बारे में बात करते हुए मिला। लेकिन जब मैंने भाषण के साथ इस प्रकार को बदलने की कोशिश की, तो यह काम नहीं करता है।आर

https://stats.stackexchange.com/questions/4040/r-compute-correlation-by-group

उत्तर

17

कैसे एक आधार आर समाधान के लिए इस बारे में:

df <- data.frame(group = rep(c("G1", "G2"), each = 10), 
       var1 = rnorm(20), 
       var2 = rnorm(20)) 

r <- by(df, df$group, FUN = function(X) cor(X$var1, X$var2, method = "spearman")) 
# df$group: G1 
# [1] 0.4060606 
# ------------------------------------------------------------ 
# df$group: G2 
# [1] 0.1272727 

और फिर, आप एक data.frame के रूप में परिणाम चाहते हैं:

data.frame(group = dimnames(r)[[1]], corr = as.vector(r)) 
# group  corr 
# 1 G1 0.4060606 
# 2 G2 0.1272727 

संपादित करें: यदि आप plyr-आधारित समाधान पसंद करते हैं, तो यहां एक है:

library(plyr) 
ddply(df, .(group), summarise, "corr" = cor(var1, var2, method = "spearman")) 
+0

त्वरित उत्तर के लिए जोश धन्यवाद। वे सब काम किया !!! ;-) – user1009166

+0

(+1) अच्छा जवाब। 'आर <- द्वारा (डीएफ, डीएफ $ समूह, FUN = फ़ंक्शन (एक्स) कोर (डीएफ [, - 1], विधि =" spearman ") के बारे में क्या? – MYaseen208

+0

@ MYaseen208। धन्यवाद। आपके द्वारा दिया गया कोड कुछ अलग देता है। मुझे इसका नाम पता नहीं है, लेकिन यह प्रत्येक सेल में एक सहसंबंध के अलावा, एक भिन्नता-कॉन्वर्सिस मैट्रिक्स की तरह है। कोड जो मैंने प्रत्येक समूह के लिए एक एकल स्केलर सहसंबंध के बजाय रिटर्न का उपयोग किया था। –

5

यहाँ एक और तरीका यह करना है:

# split the data by group then apply spearman correlation 
# to each element of that list 
j <- lapply(split(df, df$group), function(x){cor(x[,2], x[,3], method = "spearman")}) 

# Bring it together 
data.frame(group = names(j), corr = unlist(j), row.names = NULL) 

मेरी विधि, जोश की विधि की तुलना करना, और plyr समाधान rbenchmark का उपयोग कर:

Dason <- function(){ 
    # split the data by group then apply spearman correlation 
    # to each element of that list 
    j <- lapply(split(df, df$group), function(x){cor(x[,2], x[,3], method = "spearman")}) 

    # Bring it together 
    data.frame(group = names(j), corr = unlist(j), row.names = NULL) 
} 

Josh <- function(){ 
    r <- by(df, df$group, FUN = function(X) cor(X$var1, X$var2, method = "spearman")) 
    data.frame(group = attributes(r)$dimnames[[1]], corr = as.vector(r)) 
} 

plyr <- function(){ 
    ddply(df, .(group), summarise, "corr" = cor(var1, var2, method = "spearman")) 
} 


library(rbenchmark) 
benchmark(Dason(), Josh(), plyr()) 

कौन सा उत्पादन देता

> benchmark(Dason(), Josh(), plyr()) 
    test replications elapsed relative user.self sys.self user.child sys.child 
1 Dason()   100 0.19 1.000000  0.19  0   NA  NA 
2 Josh()   100 0.24 1.263158  0.22  0   NA  NA 
3 plyr()   100 0.51 2.684211  0.52  0   NA  NA 

तो ऐसा लगता है कि मेरी विधि थोड़ा तेज़ है लेकिन ज्यादा नहीं। मुझे लगता है कि जोश की विधि थोड़ा और सहज है। प्लीयर समाधान कोड करने के लिए सबसे आसान है लेकिन यह सबसे तेज़ नहीं है (लेकिन यह निश्चित रूप से बहुत सुविधाजनक है)!

+0

'बेंचमार्क' के साथ उन लोगों का परीक्षण करने के लिए धन्यवाद। इसे एक साथ रखने के लिए +1। मेरे पास कुछ अतिरिक्त टिप्पणियां हैं I (1) बेंचमार्क के लिए बार-बार कॉल पर, 'लापली (विभाजित (...) 'और' (...) 'दृष्टिकोण के बीच सामान्य अंतर 7-10% की तरह है। (2) यदि आप रुचि रखते हैं आगे बढ़ने में, यह शायद 1000+ समूहों और 1e6 + पंक्तियों के साथ कुछ बड़े डेटा.फ्रेम पर तीन विधियों का परीक्षण करने के लिए अधिक उपयोगी होगा। चीयर्स! –

+0

धन्यवाद आपके समय के लिए भी डसन !! – user1009166

3

यदि आप बड़ी संख्या में समूहों के लिए एक कुशल समाधान चाहते हैं तो data.table जाने का रास्ता है।

library(data.table) 
DT <- as.data.table(df) 
setkey(DT, group) 
DT[,list(corr = cor(var1,var2,method = 'spearman')), by = group] 
+0

+1 'setkey नोट करें 'वैकल्पिक है। कुंजी-द्वारा बहुत ही बड़े डेटासेट्स (जैसे 1e7 पंक्तियों +) के लिए अनदेखी से केवल तेज है, जहां बहुत सारे बड़े समूह भी हैं। Unkeyed-by पहले से ही बहुत तेज़ है। –