आर: समूह द्वारा सहसंबंध की गणना


17

आर में, मेरे पास एक डेटा फ्रेम है जिसमें एक क्लास लेबल सी (एक कारक) और दो माप, एम 1 और एम 2 शामिल हैं । मैं प्रत्येक वर्ग के भीतर एम 1 और एम 2 के बीच सहसंबंध की गणना कैसे करूं ?

आदर्श रूप से, मुझे प्रत्येक कक्षा और दो कॉलमों के लिए एक पंक्ति के साथ एक डेटा फ़्रेम मिलेगा: क्लास लेबल C और सहसंबंध।

जवाबों:


20

पैकेज plyr जाने का रास्ता है।

यहाँ एक सरल उपाय है:

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

require(plyr)
func <- function(xx)
{
return(data.frame(COR = cor(xx$a, xx$b)))
}

ddply(xx, .(group), func)

उत्पादन होगा:

  group         COR
1     1  0.05152923
2     2 -0.15066838
3     3 -0.04717481
4     4  0.07899114

1
(+1) अच्छा plyrपैकेज है, है ना? :)
१l

यह बहुत अच्छा काम करता है। प्लाई पैकेज को इंगित करने के लिए धन्यवाद! क्या आप कृपया "। (समूह)" वाक्य रचना की व्याख्या कर सकते हैं?
एनपीई

2
ऐक्स - ज़रूर। इसका अर्थ है "डेटा को बीच के चर द्वारा विभाजित करना (), और प्रत्येक सबसेट पर फंक्शन को पूरा करना"। इसे और अधिक चर शामिल करने के लिए, आपको बस इस सिंटैक्स का उपयोग करना चाहिए: (var1, var2, var3)। जो कि var1, var2 और var3 के स्तरों के प्रत्येक संयोजन द्वारा आपके डेटा को काटने जैसा है। और अपने कार्य को करने के लिए प्रत्येक कट पर। यह पैकेज हैडली (ggplot2 के लेखक भी) द्वारा बनाए रखा गया है, इसलिए मुझे विश्वास है कि यह विकसित होता रहेगा।
ताल गैली

2
ओह, और BTW, तुम भी कई कोर (लगभग स्वचालित रूप से) पर एक समानांतर कंप्यूटिंग के साथ प्लाई का उपयोग कर सकते हैं, देखें: r-statistics.com/2010/09/…
ताल

1
यह एक अच्छा जवाब है, लेकिन मैं चकित हूं कि इसके लिए कोई अंतर्निहित समाधान नहीं है, कोर (x, y, by = z) जैसी कोई चीज इतनी सहज होगी ...
वाल्डिर लियोनिको

12

यदि आप बेस पैकेज में कार्यों का उपयोग करने के लिए इच्छुक हैं, तो आप byफ़ंक्शन का उपयोग कर सकते हैं , फिर डेटा को फिर से इकट्ठा कर सकते हैं :

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

# This returns a "by" object
result <- by(xx[,2:3], xx$group, function(x) {cor(x$a, x$b)})

# You get pretty close to what you want if you coerce it into a data frame via a matrix
result.dataframe <- as.data.frame(as.matrix(result))

# Add the group column from the row names
result.dataframe$C <- rownames(result)

1
अच्छा धन्यवाद! मैं प्रयोग कर रहा हूं by, लेकिन यह पता नहीं लगा सका कि परिणाम को डेटा फ्रेम में कैसे बदला जाए।
एनपीई

9

आधार पैकेज और ताल के उदाहरण डेटा का उपयोग कर एक और उदाहरण:

DataCov <- do.call( rbind, lapply( split(xx, xx$group),
             function(x) data.frame(group=x$group[1], mCov=cov(x$a, x$b)) ) )

सुरुचिपूर्ण समाधान जोशू। क्या आपको लगता है कि ऐसे मामले हैं जब एक समाधान बेहतर है तो दूसरा?
ताल गैली

2
मुझे लगता है कि यह वरीयता का मामला है। मेरा उदाहरण मूल रूप से क्या plyrकरता है, लेकिन यह आपको बेहतर नियंत्रण देता है, हालांकि यह लगभग साफ नहीं है। मेरी राय बदल जाएगी अगर एक समाधान में बेहतर समय / मेमोरी प्रोफ़ाइल था। हालांकि मैंने उनकी तुलना नहीं की है।
जोशुआ उलरिच

यह सहसंबंध कैसे लौटाता है?

2

डेटा का उपयोग करना। से कम है

dt <- data.table(xx)
dtCor <- dt[, .(mCor = cor(M1,M2)), by=C]

0

यहां एक समान विधि है जो आपको प्रत्येक सहसंबंध के लिए n और p मानों के साथ एक तालिका प्रदान करेगी (सुविधा के लिए 3 दशमलव स्थानों पर गोल):

library(Hmisc)
corrByGroup <- function(xx){
  return(data.frame(cbind(correl = round(rcorr(xx$a, xx$b)$r[1,2], digits=3),
                          n = rcorr(xx$a, xx$b)$n[1,2],
                          pvalue = round(rcorr(xx$a, xx$b)$P[1,2], digits=3))))
}

0

यहां dplyrपैकेज का उपयोग करके एक अधिक आधुनिक समाधान है, (जो सवाल पूछे जाने पर अभी तक मौजूद नहीं था):

इनपुट का निर्माण करें:

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )

सहसंबंधों की गणना करें:

library(dplyr)
xx %>%
  group_by(group) %>%
  summarize(COR=cor(a,b))

उत्पादन:

Source: local data frame [4 x 2]

  group         COR
  (int)       (dbl)
1     1  0.05112400
2     2  0.14203033
3     3 -0.02334135
4     4  0.10626273
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.