2017-08-17 14 views
0

私たちは毎週更新されたファイルを持っているし、次のように、その構造は次のとおりです。補間2の間の動的な日

 ID   Code Days Yield 
KZW1KM093436 NTK273_1343 4  2.1781 
KZW1KD913708 NTK091_1370 11  2.1683 
KZK1KY011222 MKM012_0122 17  2.1602 
KZW1KM063603 NTK182_1360 32  2.1419 
KZW1KM093477 NTK273_1347 32  2.1419 
KZW1KD913740 NTK091_1374 39  2.1342 
KZW1KM063629 NTK182_1362 46  2.1269 
KZW1KM093501 NTK273_1350 53  2.1202 

私は、次の静的データ・ポイント私は毎週Yieldsを必要としているため(日数)を持っています:

28 
91 
182 
273 
364 
730 
1825 
2555 
3640 

ファイルが更新される場合は、データの構造はまた、(Daysによって並べ替え)を変更します。いくつかの可能なシナリオがあります。

  • データのDays列の値が私のStaticデータで 値のいずれかに等しい場合、私はYield列から対応する 値を取るしたいと思います。 KZK1KY011222 MKM012_0122 17 2.1602KZW1KM063603 NTK182_1360 32 2.1419
  • そうでなければ、私はこれらの2つの行を使用する必要があると思います Daysから最も近い上限値と下限値を取るようにして(Yieldを補間します例えば この特定のケースでは、私の静的28日間たい)。
  • ほとんど適用 283640に、そして私が最も近い DaysからYieldをしたい何の始まりや終わりの値は、存在しない場合。

私はExcel/VBAでこれを行うことを考えていましたが、Rソリューションも見たいと思います。どんな助けでも大歓迎です。

Yieldため

予想される出力は次の式に従って計算される :だから28日のために、この場合の

enter image description here

私が持っていると思いますYield(28 - 17)*(2.1419-2.1602)/(32-17)+2.1602 = 2.1468

+0

あなたは、静的な日付の点で期待利回りベクトル – OdeToMyFiddle

+0

@hNuを含めてもらえ役立つ

希望は、あなたに感謝 – AK88

答えて

2
A=read.table(text="ID   Code Days Yield 
       KZW1KM093436 NTK273_1343 4 2.1781 
       KZW1KD913708 NTK091_1370 11 2.1683 
       KZK1KY011222 MKM012_0122 17 2.1602 
       KZW1KM063603 NTK182_1360 32 2.1419 
       KZW1KM093477 NTK273_1347 32 2.1419 
       KZW1KD913740 NTK091_1374 39 2.1342 
       KZW1KM063629 NTK182_1362 46 2.1269 
       KZW1KM093501 NTK273_1350 53 2.1202",header=T) 

k=c(28L, 91L, 182L, 273L, 364L, 730L, 1825L, 2555L, 3640L) 

今最初の区間場所を見つけます予測される値は、

です。 10

例:

funfun(28) 
    Days Yield 
3 17 2.1602 
4 32 2.1419 
funfun(34) 
    Days Yield 
5 32 2.1419 
6 39 2.1342 
funfun(4) 
    Days Yield 
1 4 2.1781 
funfun(0) 
    Days Yield 
1 4 2.1781 
funfun(345) 
    Days Yield 
8 53 2.1202 
funfun(11) 
    Days Yield 
2 11 2.1683 

次我々は予測値を計算する関数を記述します。私たちはこれだけ取ってきた日の範囲外Kの嘘に与えられた値の

funfun1=function(i){ 
    s=funfun(i) 
    if(nrow(s)==1)return(s$Yield) 
    (i-s$Days[1])*Reduce("/",rev(sapply(s,diff)))+s$Yield[1] 
} 

sapply(k,funfun1) 
[1] 2.14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 

ほとんどを最後の値。異なる価値があればどうなるでしょうか?以下のようになります。

k=c(4,11,17,18,20,33,48,50) 
    sapply(k,funfun1) 
    [1] 2.178100 2.168300 2.160200 2.158980 2.156540 2.140800 2.124986 2.123071 

すでにデータに記載されている値を確認してください。データより上のものは、データの最終歩留まりと、必要に応じて見積もった間のものが得られます。これは

+0

私のOPを編集しました。私はあなたの最初の結果を得ていませんでした - '2.14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020'。最初のものを除いてこれらの値がすべて同じ理由は何故ですか? – AK88

+0

私は終わりの日がなければ、最も近いものを取ることを理解しました。テーブルからは、最終日が53日であることがわかります。したがって、53日以上のすべての日は53の値を取ることになります。それが私のあなたの箇条書き3を理解する方法です。そして、1日が4未満の場合、 4の利回りを取るか、これについてあなたの意見を理解していないかもしれません。あなたのポイントno.3で詳しく説明することができます。これは 'funfun1'関数のif文です – Onyambu

+0

また、あなたは別の結果を得ると言います。あなたの問題をさらに明確にしてください、あなたは期待された結果を見せてくれますか?彼/彼女が目指していることを知ることができるようにする。ありがとうございました – Onyambu