-1

这是我想做的事情:

我有一个时间序列数据框,让我们说 100 个长度为 600 的时间序列 - 每个都在数据框的一列中。

我想随机选取 4 个时间序列,然后为它们分配总和为 1 的随机权重(即 0.1、0.5、0.3、0.1)。使用那些我想计算 4 个加权时间序列变量(例如凸组合)之和的平均值。

我想这样做让我们说 100k 次并将每个结果存储在表格中

ts1.name, ts2.name, ts3.name, ts4.name, weight1, weight2, weight3, weight4, mean

这样我就得到了 9*100k df。

我已经尝试了一些东西,但是 R 在循环方面非常糟糕,而且我知道由于 R 设计,面向矢量的解决方案更好。

这就是我所做的,我知道这很可怕

df 的形式为

v1,v2,v2.....v100
1,5,6,.......9
2,4,6,.......10
3,5,8,.......6
2,2,8,.......2
etc

e=NULL
for (x in 1:100000)
{
  s=sample(1:100,4)#pick 4 variables randomly
  a=sample(seq(0,1,0.01),1)
  b=sample(seq(0,1-a,0.01),1)
  c=sample(seq(0,(1-a-b),0.01),1)
  d=1-a-b-c
  e=c(a,b,c,d)#4 random weights
  average=mean(timeseries.df[,s]%*%t(e))
  e=rbind(e,s,average)#in the end i get the 9*100k df
  }

该程序运行缓慢。

编辑:

感谢我的帮助,我不习惯思考 R,也不太习惯将每个问题转换为 R 中需要的矩阵代数方程。如果我想计算,问题就会变得有点复杂标准差。我需要协方差矩阵,我不确定我是否可以/如何从原始 timeseries.df 协方差矩阵中为每个样本选择随机元素,然后计算样本方差

t(sampleweights)%*%sample_cov.mat%*%sampleweights

最终得到 ts.weighted_standard_dev 矩阵

最后一个问题如果我想引导原始 df x 次然后应用相同的计算来测试我的数据的稳健性,最好的方法是什么

谢谢

4

1 回答 1

2

好的,让我试着解决你的问题。作为前言:我想不出任何应用程序都适合做你正在做的事情。但是,这是由您判断的(尽管我对应用程序感兴趣......)

首先,请注意加权和的均值等于均值的加权和,如下所示:

在此处输入图像描述

让我们生成一些示例数据:

timeseries.df <- data.frame(matrix(runif(1000, 1, 10), ncol=40))
n <- 4                # number of items in the convex combination
replications <- 100   # number of replications

因此,我们可以首先计算所有列的平均值,然后使用这个平均值进行所有进一步的计算:

ts.means <- apply(timeseries.df, 2, mean)

让我们创建一些示例:

samples <- replicate(replications, sample(1:length(ts.means), n))

以及这些样本的相应权重:

weights <- matrix(runif(replications*n), nrow=n)
# Now norm the weights so that each column sums up to 1:
weights <- weights / matrix(apply(weights, 2, sum), nrow=n, ncol=replications, byrow=T)

那部分有点棘手。单独运行单个函数并进行少量复制,以弄清楚它们在做什么。请注意,我采用了不同的方法来生成权重:首先获取均匀分布的数据,然后通过它们的总和对其进行规范。结果应该与您的方法相同,但具有任意分辨率和更好的性能。

再有一点技巧:获取每个时间序列的平均值并将它们与刚刚计算的权重相乘:

ts.weightedmeans <- matrix(ts.means[samples], nrow=n) * weights
# and sum them up:
weights.sum <- apply(ts.weightedmeans, 2, sum)

现在,我们基本上完成了 - 所有信息都可用并且可以使用。剩下的只是正确格式化 data.frame 的问题。

result <- data.frame(t(matrix(names(ts.means)[samples], nrow=n)), t(weights), weights.sum)

# For perfectness, use better names:
colnames(result) <- c(paste("Sample", 1:n, sep=''), paste("Weight", 1:n, sep=''), "WeightedMean")

我会假设这种方法相当快 - 在我的系统上,代码需要 1.25 秒,重复次数是你所说的。

最后一句话:你很幸运,我正在寻找一些让我思考了一段时间的东西。您的问题不是以鼓励用户思考您的问题并给出好的答案的方式提出的。下次遇到问题时,我建议您之前阅读 www.whathaveyoutried.com 并尝试尽可能地分解问题。你的问题越具体,你的答案就会越快、质量越高。


编辑

您正确地提到,上面生成的权重并非均匀分布在整个值范围内。(我仍然不得不反对,即使 (0.9, 0.05, 0.025, 0.025) 也是可能的,但这不太可能)。

不过,现在我们在不同的联赛打球。我很确定您采用的方法也不是均匀分布的——最后一个值为 0.9 的概率远小于第一个值那么大的概率。老实说,关于根据 L_1 距离在单位球体上生成均匀分布的随机数,我没有为您准备好一个好主意。(实际上,它并不是一个真正的单位球体,但两个问题应该是相同的)。

因此,我不得不放弃这一点。

我建议您在 stats.stackexchange.com 上提出一个关于这些随机向量生成的新问题。使用正确的技术可能相当简单。但是,我怀疑带有该标题和相当长答案的这个问题会吸引潜在的响应者...(如果您在那边问问题,我会很感激一个链接,因为我想知道解决方案;)

关于方差:我不完全了解您要计算哪个标准差。如果您只想计算每个时间序列的标准差,为什么不使用内置函数sd?在上面的计算中,您可以直接替换mean它。

引导:这是一个全新的问题。通过开始新的问题来区分不同的主题。

于 2012-11-25T20:05:57.617 回答