2013-08-02 61 views
1

函数my.ccf生成一个阴谋。更改do.call内的阴谋的标题

my.ccf <- function(dat) 
{ 
require(forecast) 
modx <- auto.arima(dat[,1]) 
modx$series <- colnames(dat)[1] 
mody <- Arima(dat[,2], model=modx) 
mody$series <- colnames(dat)[2] 
ccf1 <- ccf(residuals(modx), residuals(mody), type="correlation", ylab="CCF", 
      main=paste(colnames(dat)[1], "&", colnames(dat)[2], sep=" ")) 
return(list(modx=modx, mody=mody, ccf=ccf1))  
} 
dat1 <- data.frame(p=rnorm(50), q=rnorm(50)); my.ccf(dat1) 

产生的图形具有 'P & X' 等作为使用do.call功能year.ccf内部标题

我在应用到另一个data.frame(DAT2)这个函数。首先它会按年份对传递的数据进行子集划分(我有单独的函数来做到这一点,为了说明的目的,我在这里使用for循环),然后将my.ccf应用于名为'x'的列与给定列的成对组合在var.do. var.do的长度因形式3至9而异。我必须在不同的数据框上重复多次(超过500次)并尽可能自动执行。

year.ccf1 <- function(dat, var.do=c('a','b')) 
{ 
year.form <- format(dat2$date, '%Y') 
dat$year <- factor(year.form, levels=unique(year.form), ordered=TRUE) 
yl <- levels(dat$year) 
ydat <- list() 
for(i in 1:length(yl)) 
ydat[[i]] <- subset(dat,year==yl[i]) 
wdat <- list() 
for(i in 1:length(yl)){ 
a <- list() 
for(j in 1:length(var.do)){ 
#par(mfrow=c(2,2)) 
a[[j]] <- do.call(my.ccf, list(ydat[[i]][,eval(c(var.do[j],'x'))])) 
} 
names(a) <- var.do 
wdat[[i]] <- a   
} 
names(wdat) <- yl 
return(wdat) 
} 
date <- seq(as.Date("2011/1/1"), as.Date("2013/8/1"), by = "months") 
dat2 <- data.frame(date=date,x =rnorm(length(date)), y=rnorm(length(date)),   
a=rnorm(length(date)),b=rnorm(length(date))) 
pdf("./temp/dat2.pdf") 
A <- year.ccf1(dat2, var.do=c('a', 'b')) 
dev.off() 

我试图改变dat2.pdf每个情节的标题有新年邮票的列名,如“2011年:CCF一个& X”不知道,我到底的。缺少明显的东西还是不明白如何把以论证在一个do.call像下面。

do.call(my.ccf, main=paste("Year ", yl[i], var.do[j], " & x", sep=" "), list(ydat[[i] 
[,eval(c(var.do[j],'x'))])) 

还试图将多个地块在一个页面,使PDF格式的文件尺寸较小。我试图比肩(mfrow)(uncommented)来处理第二个问题,但是失败了。

任何帮助都是mu ch赞赏。

回答

1

我想你应该首先给my.ccf一个额外的参数。例如:

my.ccf <- function(dat,year=NA) 
{ 
    ... 
    title=paste(colnames(dat)[1], "&", colnames(dat)[2], sep=" ") 
    if(!is.na(year)) 
    title <- paste('Year', year,': CCF',title) 
    ccf1 <- ccf(residuals(modx), ..., main=title) 
    ..... 
} 

然后你就改变了do.call到这样的事情:

do.call(my.ccf, list(dat=list(ydat[[i]][,eval(c(var.do[j],'x'))]),year=i)) 

那是说认为你year.ccf1功能过于复杂,你极其低效。例如,尝试使用outermapply来重写它。

year.ccf1 <- function(dat, var.do=c('a','b')) 
{ 
    dat$year <- factor(format(dat$date, '%Y')) 
    ydat <- split(dat,dat$year) 
    outer(names(ydat),var.do,function(x,y) 
    Map(function(i,j) 
     do.call(my.ccf, list(dat=ydat[[i]][,c(j,'x')],year=i)) 
      ,x,y) 
) 
} 
+0

感谢堆代码和使我高效率。计算结果很好,但给出了错误消息' dims [product 6]与对象[18]的长度不匹配'。这是由于使用_outer()_期望的长度应该是18,但它返回一个列表6.任何想法来解决这个问题?我尝试lapply(),因为输入和输出都是列表,但也会产生其他错误。 – ykh

+1

明白了! '外(... mapply(.....)),x,y,** SIMPLIFY = FALSE **))'做窍门。每个组合的输出现在存储在一个列表中。 – ykh

+0

@ykh好!我会更新我的答案,另一个选择是用'Map'替换'mapply'。 – agstudy