循环中的随机数据集

时间:2012-11-25 18:15:57

标签: r

这是我想要做的:

我有一个时间序列数据框,让我们说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次,然后应用相同的计算来测试我的数据的稳健性

感谢

1 个答案:

答案 0 :(得分:2)

好的,让我试着解决你的问题。作为前言:我认为没有任何应用可以做你正在做的事情是明智的。但是,这是由你来判断的(不是我对应用程序感兴趣的......)

首先,请注意加权和的平均值等于平均值​​的加权和,如:

enter image description here

让我们生成一些样本数据:

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

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