我有名为dat和res的列表,每个列表包含33个数据集。Iam使用这样的for loop运行全局最小方差组合:
for(i in dat) {
N <- ncol(i)
Amat <- t(rbind( rep(1,N), diag(rep(1,N)), diag(rep(-1,N))))
bvec <- c(1 , rep(0,N), rep(-0.15,N))
Dmat <- cov.shrink(i) #from tawny package
dvec <- rep(0,N)
mvw <- solve.QP( Dmat, dvec, Amat, bvec, meq = 1 )$solution #from quadprog package
names(mvw) = colnames(i)
}它的工作,但只节省了最后的迭代当然。我不知道怎么把他们全部救出来。我需要将所有33个mvw结果保存在一个列表中。我该怎么做呢?
之后,我必须使用等效的mvw数据集来评估res的结果:
mvwreturns = res%*%matrix(mvw,ncol=1)
此命令为我提供每个期间的portfolio评估。每个mvw数据与一个res数据集匹配。我该怎么做?我想知道我是否需要运行另一个for loop。
任何帮助都是非常感谢的。为我糟糕的英语感到抱歉。
发布于 2014-11-29 20:39:13
您可以执行以下操作:
在循环之前启动一个空列表mvw。然后将每个数据集添加为列表中的新元素:
mvw <- NULL #initiate list
counter <- 1
for(i in dat ) {
N <- ncol(i)
Amat <- t(rbind( rep(1,N), diag(rep(1,N)), diag(rep(-1,N))))
bvec <- c(1 , rep(0,N), rep(-0.15,N))
Dmat <- cov.shrink(i) #from tawny package
dvec <- rep(0,N)
mvw[[counter]] <- solve.QP( Dmat, dvec, Amat, bvec, meq = 1 )$solution) #from quadprog package
#for each iteration mvw will be stored as the i-th element in a list
names(mvw[[counter]]) = names(i)
counter <- counter + 1
}然后再做一个小循环,和以前一样,做你想做的事情:
mvwreturns <- NULL
for ( i in 1:length(mvw) {
mvwreturns[i] = res[i]%*%matrix(mvw[i],ncol=1)
}对不起,我没有任何数据来运行您的脚本,但是您知道了。
希望能帮上忙。
发布于 2014-11-29 20:14:29
不要使用for-循环,而要查看mapply。将您希望在每个条目上运行的代码保存到返回mvw的函数中,将dat和res推到带有上述函数的mapply调用中,它应该从dat和res中分离出每个元素的结果集列表。
https://stackoverflow.com/questions/27206542
复制相似问题