2012-03-30 10 views
5

मैं रोलिंग विंडो का उपयोग कर कॉन्वर्सिस मैट्रिस (और माध्य वैक्टर) उत्पन्न करना चाहता हूं। लेकिन मेरे सभी प्रयासों में rollapplycov से कॉन्वर्सिस मैट्रिस को ढेर करता है और प्री-आवंटित स्थान से बाहर चला जाता है (उदाहरण के लिए, यदि मेरे मूल डेटा में 40 अवलोकन हैं, तो rollapply 40 से अधिक पंक्तियां नहीं लौटा सकता है)।रोलरली मैट्रिस की एक सूची वापस कर सकते हैं?

क्या कोई तरीका है कि मैं matrices की सूची लौटने के लिए rollapply प्राप्त कर सकता हूं? या data.frame को वापस करने के लिए जो मूल data.frame से बड़ा है, जिसे मैं मैन्युअल रूप से सूची में विभाजित कर सकता हूं? मेरा अंतिम लक्ष्य पैनल लेना है, पैनल को अलग-अलग data.frame एस की सूची में विभाजित करें, प्रत्येक डेटा फ्रेम के लिए रोलिंग कॉन्वर्सिस और साधनों की गणना करें, फिर कॉन्वर्सिस की इन सूचियों का उपयोग करें और इसका अर्थ है कि व्यक्तियों के समूह की तुलना में डाउनस्ट्रीम।

यहां कुछ कोड है। मेरी समस्या यह है कि my.fun सभी कॉन्वर्सिस मैट्रिक्स कैलुक्लेशन से डेटा वापस नहीं करेगा। क्या मेरा खुद का rollapply कोड करने का सबसे अच्छा विकल्प है? या मेरा खुद का cov जो एक वेक्टर लौटाता है जिसे मैं वापस मैट्रिक्स में परिवर्तित करता हूं? धन्यवाद!

library("zoo") 
data.df <- data.frame(sic = rep(1:10, each = 40), 
         year = rep(1:40, len = 10*40), 
         one = rnorm(10*40), 
         two = 2*rnorm(10*40), 
         three = 3*rnorm(10*40)) 
data.list <- split(data.df, data.df$sic) 
data.list <- lapply(data.list, zoo) 
my.fun <- function(x) { 
    x <- x[, c("one", "two", "three")] 
    rollapply(x, 
       width = 10, 
       FUN = cov, 
       by.column = F, 
       align = "right") 
} 
cov.list <- lapply(data.list, FUN = my.fun) 
+0

क्या आप अपना लक्ष्य और स्पष्ट करने की कोशिश कर सकते हैं? वास्तव में क्या बीच में है? यह कोड में प्रकट नहीं होता है और आपने कितने समूहों की कल्पना की है कि डेटा.लिस्ट में है? यह एक चिड़ियाघर श्रृंखला बनाता है: 'my.fun (data.list [[1]]) '। क्या आप एसआईसी == 1 समूह से क्या उम्मीद करते हैं? –

+0

@DWin मैं 10 साल की चलती खिड़की के आधार पर प्रत्येक वर्ष प्रत्येक एसआईसी के लिए एक कॉन्वर्स मैट्रिक्स पसंद करूंगा। यहां 'चिड़ियाघर' वस्तु रखने के बारे में कुछ भी पवित्र नहीं है, मैं स्केलर उत्पन्न करने के लिए 'रोलप्ली' का उपयोग करने के बारे में पहले ही परिचित था। –

उत्तर

2

rollapply.zoo कोड पर एक नज़र में के बाद, मैं वहाँ यह है कि तुम क्या चाहते हो बनाने के लिए एक रास्ता है नहीं लगता। अपने स्वयं के फ़ंक्शन को रोल करना मुश्किल नहीं है (पन इरादा)।

rollcov <- function(x, width=10) { 
    len <- NROW(x) 
    add <- rep(1:(len-width)-1,each=width) 
    seq.list <- split(rep(1:width,len-width)+add, add) 
    lapply(seq.list, function(y) cov(x[y,])) 
} 

rollcov(data.list[[1]][,c("one","two","three")],10) 
all <- lapply(data.list, function(x) rollcov(x[,c("one","two","three")],10)) 
+0

यह करता है! धन्यवाद! मुझे यह भी एहसास हुआ कि मैं एक वेक्टर लौटने में 'रोलप्ली' की चाल कर सकता हूं, फिर उस वेक्टर को मैट्रिक्स में वापस घुमाएं (मैं इसे एक उत्तर के रूप में जोड़ूंगा)। –

2

मुझे एहसास हुआ कि मैं एक वेक्टर लौटने में रोलप्ली की चाल कर सकता हूं, फिर उस वेक्टर को मैट्रिक्स में वापस घुमाएं। यह चाल plyr पैकेज से वेक्टर को वापस मैट्रिक्स में घुमाने के लिए alply का उपयोग कर रही है।

library("plyr") 
library("zoo") 
data.df <- data.frame(sic = rep(1:10, each = 40), 
         year = rep(1:40, len = 10*40), 
         one = rnorm(10*40), 
         two = 2*rnorm(10*40), 
         three = 3*rnorm(10*40)) 
data.list <- split(data.df, data$sic) 
data.list <- lapply(data.list, zoo) 
my.fun <- function(x) { 
    x <- x[, c("one", "two", "three")] 
    rollapply(x, 
       width = 10, 
       function(x) as.vector(cov(x)), 
       by.column = F, 
       align = "right") 
} 
my.fun.2 <- function(x) { 
    alply(x, 1, matrix, nrow = sqrt(ncol(x))) 
} 
cov.list <- lapply(data.list, FUN = my.fun) 
cov.list.2 <- lapply(cov.list, my.fun.2) 

या, सरणियों की एक सूची के लिए मैं aaply साथ alply बदल सकते हैं।

2

दूसरा data.list<- निकालें और my.fun में संशोधन करें ताकि दिया data.df हम निम्नलिखित है (जो यथोचित मूल के करीब है):

data.list <- split(data.df, data.df$sic) 
my.fun <- function(x) { 
    z <- zoo(x[, c("one", "two", "three")], x$year) 
    ccov <- function(x) c(cov(x)) 
    r <- rollapplyr(z, width = 10, FUN = ccov, by.column = FALSE) 
    toMat <- function(tt) matrix(r[tt], ncol(z)) 
    sapply(paste(time(r)), toMat, simplify = FALSE) # sapply(char,...) adds names 
} 
cov.list <- lapply(data.list, FUN = my.fun) 

संपादित करें: थोड़ा सा सरलीकरण।

+0

बहुत बढ़िया। धन्यवाद! मैं यह समझ नहीं पाया कि कैसे 'alply' के आसपास जाना है क्योंकि मुझे एक ही सूची में बार-बार परिचालन करने के लिए तय किया गया था। यह अच्छा है। –

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