2012-02-27 19 views
12

मेरे पास 2396x34 double matrix नाम y है जिसमें प्रत्येक पंक्ति (23 9 6) लगातार 34 समय सेगमेंट वाली एक अलग स्थिति का प्रतिनिधित्व करती है।भारित पियरसन का सहसंबंध?

मैं भी एक numeric[34] नामित x कि 34 लगातार समय खंडों के एक स्थिति का प्रतिनिधित्व करता है।

वर्तमान में मैं इस तरह y और x में प्रत्येक पंक्ति के बीच सहसंबंध की गणना कर रहा हूँ:

crs[,2] <- cor(t(y),x)

क्या मैं अब जरूरत है एक भारित सहसंबंध के साथ ऊपर बयान में cor समारोह को बदलने के लिए है। वजन वेक्टर xy.wt 34 तत्व लंबा है ताकि लगातार 34 समय के प्रत्येक खंड में एक अलग वजन आवंटित किया जा सके।

मैं Weighted Covariance Matrix समारोह cov.wt पाया और सोचा कि अगर मैं पहले scale डेटा यह सिर्फ cor समारोह की तरह काम करना चाहिए। असल में आप फ़ंक्शन के लिए एक सहसंबंध मैट्रिक्स को वापस करने के लिए निर्दिष्ट कर सकते हैं। दुर्भाग्य से ऐसा प्रतीत नहीं होता है कि मैं इसे उसी तरीके से उपयोग कर सकता हूं क्योंकि मैं अपने दो चर (x और y) को अलग से आपूर्ति नहीं कर सकता।

क्या किसी को भी इस तरह से पता है कि मैं कितनी गति बलि किए बिना वर्णित तरीके से भारित सहसंबंध प्राप्त कर सकता हूं?

संपादित करें: शायद कुछ गणितीय समारोह आदेश एक ही परिणाम है कि मैं तलाश कर रहा हूँ प्राप्त करने के लिए cor समारोह से पहले y लिए लागू किया जा सकता है। हो सकता है कि अगर मैं प्रत्येक तत्व को xy.wt/sum(xy.wt) से गुणा करता हूं?

संपादित करें # 2 मुझे boot पैकेज में एक और फ़ंक्शन corr मिला।

corr(d, w = rep(1, nrow(d))/nrow(d)) 

d 
A matrix with two columns corresponding to the two variables whose correlation we wish to calculate. 

w 
A vector of weights to be applied to each pair of observations. The default is equal weights for each pair. Normalization takes place within the function so sum(w) need not equal 1. 

यह भी मुझे नहीं चाहिए बल्कि यह करीब है।

x<-cumsum(rnorm(34)) 
y<- t(sapply(1:2396,function(u) cumsum(rnorm(34)))) 
xy.wt<-1/(34:1) 

crs<-cor(t(y),x) #this works but I want to use xy.wt as weight 

उत्तर

4

आप वापस सहसंबंध की परिभाषा पर जा सकते हैं:

# 3 यहाँ संपादित कुछ कोड डेटा के प्रकार के साथ मैं काम कर रहा हूँ उत्पन्न करने के लिए है।

f <- function(x, y, w = rep(1,length(x))) { 
    stopifnot(length(x) == dim(y)[2]) 
    w <- w/sum(w) 
    # Center x and y, using the weighted means 
    x <- x - sum(x*w) 
    y <- y - apply(t(y) * w, 2, sum) 
    # Compute the variance 
    vx <- sum(w * x * x) 
    vy <- rowSums(w * y * y) # Incorrect: see Heather's remark, in the other answer 
    # Compute the covariance 
    vxy <- colSums(t(y) * x * w) 
    # Compute the correlation 
    vxy/sqrt(vx * vy) 
} 
f(x,y)[1] 
cor(x,y[1,]) # Identical 
f(x, y, xy.wt) 
+0

उत्कृष्ट! उसने ऐसा किया एक बार फिर धन्यवाद! मैंने सोचा कि आर में लिखे गए कार्यों आर में बनाए गए लोगों की तुलना में काफी धीमे होंगे ... लेकिन मुझे नहीं लगता? –

22

दुर्भाग्य से स्वीकार किए जाते हैं जवाब गलत जब y एक से अधिक पंक्ति के एक मैट्रिक्स है। त्रुटि लाइन

vy <- rowSums(w * y * y) 

हम w द्वारा y के कॉलम गुणा करना चाहते हैं में है, लेकिन इस w के तत्वों, आवश्यक के रूप में पुनर्नवीनीकरण द्वारा पंक्तियों गुणा करेंगे।इस प्रकार

> f(x, y[1, , drop = FALSE], xy.wt) 
[1] 0.103021 

सही, क्योंकि इस मामले में गुणन तत्व के लिहाज से, जो स्तंभ-वार गुणा यहाँ के बराबर है किया जाता है है, लेकिन

> f(x, y, xy.wt)[1] 
[1] 0.05463575 

row- की वजह से एक गलत जवाब देता है बुद्धिमान गुणा।

हम समारोह सही कर सकते हैं के रूप में

f2 <- function(x, y, w = rep(1,length(x))) { 
    stopifnot(length(x) == dim(y)[2]) 
    w <- w/sum(w) 
    # Center x and y, using the weighted means 
    x <- x - sum(x * w) 
    ty <- t(y - colSums(t(y) * w)) 
    # Compute the variance 
    vx <- sum(w * x * x) 
    vy <- colSums(w * ty * ty) 
    # Compute the covariance 
    vxy <- colSums(ty * x * w) 
    # Compute the correlation 
    vxy/sqrt(vx * vy) 
} 

अनुसरण करता है और boot पैकेज से corr द्वारा उत्पादित उन के खिलाफ परिणामों की जांच:

> res1 <- f2(x, y, xy.wt) 
> res2 <- sapply(1:nrow(y), 
+    function(i, x, y, w) corr(cbind(x, y[i,]), w = w), 
+    x = x, y = y, w = xy.wt) 
> all.equal(res1, res2) 
[1] TRUE 

जो अपने आप में एक और तरीका यह समस्या हो सकती है कि देता है हल किया।

matrix.corr <- function (a, b, w = rep(1, nrow(a))/nrow(a)) 
{ 
    # normalize weights 
    w <- w/sum(w) 

    # center matrices 
    a <- sweep(a, 2, colSums(a * w)) 
    b <- sweep(b, 2, colSums(b * w)) 

    # compute weighted correlation 
    t(w*a) %*% b/sqrt(colSums(w * a**2) %*% t(colSums(w * b**2))) 
} 

ऊपर के उदाहरण और हीथर से सहसंबंध समारोह का उपयोग करना:

+0

@vincentzoonekynd शायद आपको इसे देखना चाहिए और टिप्पणी करना चाहिए? – Andrie

+0

वास्तव में मेरे उत्तर में एक बग है (मैं इसे हटाना चाहता था, लेकिन स्वीकार्य उत्तरों को हटाना संभव नहीं है)। जब मैं गलत आयामों के साथ वस्तुओं को गुणा करता हूं, तो आमतौर पर मुझे चेतावनी की उम्मीद होती है, लेकिन इस मामले में कोई भी नहीं था ... –

+0

मैंने सोचा कि बाद में यह एक टिप्पणी जोड़ने के लिए बेहतर होगा और आपको अपना उत्तर संपादित करने दें, इसके बारे में खेद है। कम से कम बग अब ध्वजांकित है और आपको अभी भी अधिकांश काम करने का श्रेय मिलता है! –

2

यहाँ दो मैट्रिक्स के बीच भारित पियर्सन सहसंबंध की गणना करने के सामान्यीकरण (बजाय एक वेक्टर और एक मैट्रिक्स, मूल प्रश्न के रूप में) है , हम इसे सत्यापित कर सकते हैं:

> sum(matrix.corr(as.matrix(x, nrow=34),t(y),xy.wt) - f2(x,y,xy.wt)) 
[1] 1.537507e-15 

वाक्य रचना बुला के संदर्भ में, यह जैसा दिखता है अनिर्धारित cor:

> a <- matrix(c(1,2,3,1,3,2), nrow=3) 
> b <- matrix(c(2,3,1,1,7,3,5,2,8,1,10,12), nrow=3) 
> matrix.corr(a,b) 
    [,1]  [,2] [,3]  [,4] 
[1,] -0.5 0.3273268 0.5 0.9386522 
[2,] 0.5 0.9819805 -0.5 0.7679882 
> cor(a, b) 
    [,1]  [,2] [,3]  [,4] 
[1,] -0.5 0.3273268 0.5 0.9386522 
[2,] 0.5 0.9819805 -0.5 0.7679882