-1

これが私がやりたいことです:

私は、データフレームの1列にそれぞれ長さ600の100個の時系列がある時系列データフレームを持っています。

4 つの時系列をランダムに選択し、合計が 1 になるランダムな重み (つまり、0.1、0.5、0.3、0.1) を割り当てたいと考えています。それらを使用して、4 つの加重時系列変数 (凸結合など) の合計の平均を計算したいと考えています。

これを10万回言って、各結果をフォームに保存したい

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 に答える