2010-08-26 10 views
40

मेरे पास डेटाफ्रेम है और correlation (स्पीरमैन के साथ, डेटा स्पष्ट और रैंकिंग के साथ) की गणना करना चाहते हैं, लेकिन केवल कॉलम के सबसेट के लिए। मैंने सभी के साथ प्रयास किया, लेकिन आर cor() फ़ंक्शन केवल संख्यात्मक डेटा स्वीकार करता है (x संख्यात्मक होना चाहिए, त्रुटि संदेश कहता है), भले ही स्पीरमैन का उपयोग किया जाए।सहसंबंध की गणना करें - कोर() - कॉलम के केवल एक सबसेट के लिए

एक ब्रूट दृष्टिकोण डेटाफ्रेम से गैर-संख्यात्मक कॉलम को हटाना है। यह सुरुचिपूर्ण नहीं है, गति के लिए मैं अभी भी सभी कॉलम के बीच सहसंबंधों की गणना नहीं करना चाहता हूं।

मुझे आशा है कि "कॉलम x, y, z" के लिए सहसंबंधों की गणना करने का एक तरीका है। कॉलम संदर्भ संख्या या नाम से हो सकता है। मुझे लगता है कि उन्हें उपलब्ध कराने का लचीला तरीका एक वेक्टर के माध्यम से होगा।

किसी भी सुझाव की सराहना की जाती है।

उत्तर

55

यदि आप एक dataframe जहां कुछ स्तंभ संख्यात्मक कर रहे हैं और कुछ अन्य कर रहे हैं (चरित्र या कारक) है और आप केवल सांख्यिक स्तंभ के लिए सह-संबंध करना चाहते हैं, तुम कर सकते हो निम्नलिखित:

set.seed(10) 

x = as.data.frame(matrix(rnorm(100), ncol = 10)) 
x$L1 = letters[1:10] 
x$L2 = letters[11:20] 

cor(x) 

Error in cor(x) : 'x' must be numeric 

लेकिन

cor(x[sapply(x, is.numeric)]) 

      V1   V2   V3   V4   V5   V6   V7 
V1 1.00000000 0.3025766 -0.22473884 -0.72468776 0.18890578 0.14466161 0.05325308 
V2 0.30257657 1.0000000 -0.27871430 -0.29075170 0.16095258 0.10538468 -0.15008158 
V3 -0.22473884 -0.2787143 1.00000000 -0.22644156 0.07276013 -0.35725182 -0.05859479 
V4 -0.72468776 -0.2907517 -0.22644156 1.00000000 -0.19305921 0.16948333 -0.01025698 
V5 0.18890578 0.1609526 0.07276013 -0.19305921 1.00000000 0.07339531 -0.31837954 
V6 0.14466161 0.1053847 -0.35725182 0.16948333 0.07339531 1.00000000 0.02514081 
V7 0.05325308 -0.1500816 -0.05859479 -0.01025698 -0.31837954 0.02514081 1.00000000 
V8 0.44705527 0.1698571 0.39970105 -0.42461411 0.63951574 0.23065830 -0.28967977 
V9 0.21006372 -0.4418132 -0.18623823 -0.25272860 0.15921890 0.36182579 -0.18437981 
V10 0.02326108 0.4618036 -0.25205899 -0.05117037 0.02408278 0.47630138 -0.38592733 
       V8   V9   V10 
V1 0.447055266 0.210063724 0.02326108 
V2 0.169857120 -0.441813231 0.46180357 
V3 0.399701054 -0.186238233 -0.25205899 
V4 -0.424614107 -0.252728595 -0.05117037 
V5 0.639515737 0.159218895 0.02408278 
V6 0.230658298 0.361825786 0.47630138 
V7 -0.289679766 -0.184379813 -0.38592733 
V8 1.000000000 0.001023392 0.11436143 
V9 0.001023392 1.000000000 0.15301699 
V10 0.114361431 0.153016985 1.00000000 
+6

यदि आप वास्तव में केवल कॉलम 1, 3 पर सहसंबंध क्या करना चाहते हैं, और 10, आप हमेशा 'कर सकता कोर (एक्स [ग (1, 3, 10)])' – Greg

+1

: यह नीचे की तरह दिखता है क्षमा करें, यह संख्यात्मक, गैर-संख्यात्मक डेटा के लिए है। मैं इसे सिर्फ मामले में छोड़ दूंगा। – Greg

+1

खुश है कि आपने इसे छोड़ा, ग्रेग। आपने पहले से ही किसी की मदद की है - इससे पहले से ही मुझे किसी अन्य रचनात्मक तरीके से सपने में मदद मिली है :) –

13

संख्यात्मक डेटा के लिए आपके पास समाधान है। लेकिन यह स्पष्ट डेटा है, आपने कहा। फिर जीवन थोड़ा और जटिल हो जाता है ...

ठीक है, पहले: दो स्पष्ट चर के बीच संबंध की मात्रा स्पीरमैन रैंक सहसंबंध के साथ नहीं मापा जाता है, लेकिन उदाहरण के लिए ची-स्क्वायर परीक्षण के साथ। वास्तव में तर्क कौन सा है। रैंकिंग का मतलब है कि आपके डेटा में कुछ ऑर्डर है। अब मुझे बताओ कि बड़ा, पीला या लाल क्या है? मुझे पता है, कभी-कभी आर स्पष्ट डेटा पर एक spearman रैंक सहसंबंध प्रदर्शन करता है। अगर मैं पीला 1 और लाल 2 कोड करता हूं, तो आर पीले रंग से लाल बड़े पर विचार करेगा।

तो, स्पष्ट डेटा के लिए स्पीरमैन के बारे में भूल जाओ। मैं chisq-test और combn() का उपयोग करके कॉलम चुनने का तरीका दिखाऊंगा। लेकिन तुम Agresti की पुस्तक के साथ थोड़ा और समय से लाभ होगा: http://www.amazon.com/Categorical-Analysis-Wiley-Probability-Statistics/dp/0471360937

set.seed(1234) 
X <- rep(c("A","B"),20) 
Y <- sample(c("C","D"),40,replace=T) 

table(X,Y) 
chisq.test(table(X,Y),correct=F) 
# I don't use Yates continuity correction 

#Let's make a matrix with tons of columns 

Data <- as.data.frame(
      matrix(
      sample(letters[1:3],2000,replace=T), 
      ncol=25 
     ) 
     ) 

# You want to select which columns to use 
columns <- c(3,7,11,24) 
vars <- names(Data)[columns] 

# say you need to know which ones are associated with each other. 
out <- apply(combn(columns,2),2,function(x){ 
      chisq.test(table(Data[,x[1]],Data[,x[2]]),correct=F)$p.value 
     }) 

out <- cbind(as.data.frame(t(combn(vars,2))),out) 

तो फिर तुम मिलना चाहिए:

> out 
    V1 V2  out 
1 V3 V7 0.8116733 
2 V3 V11 0.1096903 
3 V3 V24 0.1653670 
4 V7 V11 0.3629871 
5 V7 V24 0.4947797 
6 V11 V24 0.7259321 

कहाँ V1 और V2 के बीच जो चर यह जाता है का संकेत मिलता है, और "बाहर" देता है एसोसिएशन के लिए पी मूल्य। यहां सभी चर स्वतंत्र हैं। जो आप उम्मीद करेंगे, क्योंकि मैंने डेटा को यादृच्छिक रूप से बनाया है।

+0

क्षमा करें, मेरे पास वर्कस्पेस में बहुत से निष्क्रिय चर से बचने के लिए अक्सर घोंसला कार्यों की प्रवृत्ति है। यदि आप कोड की समझ नहीं ले सकते हैं, तो बस पूछें और मैं समझाऊंगा कि यह क्या करता है। –

+0

धन्यवाद। मैं वास्तव में इस सवाल में उल्लेख करना भूल गया कि डेटा स्पष्ट है लेकिन रैंक (कुछ के साथ अनुमोदन का स्तर)। कोड के लिए आपको फिर भी वोट मिलता है (जिसमें से मैं वैसे भी सामान सीखूंगा) और पुस्तक संदर्भ के लिए। – wishihadabettername

+0

आह, ठीक है। यह बताता है :-) व्याख्यान के लिए खेद है, तो कोई नुकसान नहीं हुआ। मैं निश्चित रूप से Agresti की सिफारिश कर सकते हैं। यह मानक है जब यह स्पष्ट डेटा विश्लेषण के लिए आता है। –

1

मुझे रैटल द्वारा उत्पन्न आर स्क्रिप्ट को देखकर एक आसान तरीका मिला।

correlations <- cor(mydata[,c(1,3,5:87,89:90,94:98)], use="pairwise", method="spearman") 
+0

यह लगभग वही है जो [ग्रेग ने अपने उत्तर के लिए एक टिप्पणी में लिखा था] (http://stackoverflow.com/questions/3571909/r-how-to-calculate-correlation-cor-for-only-a-subset-of -columns/3572115 # 3572115)। – Marek

+1

आह, ठीक है, मैं sapply() के उपयोग से अलग हो गया। – wishihadabettername

संबंधित मुद्दे