2017-08-17 42 views
0

我們有一個每週更新的文件,其結構如下:插值兩者之間的動態天

 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列採取相應的 值。
  • 否則,我想從 Days取最接近的上限和下限,並獲得插值Yield(如我在 這種特殊情況下的靜態28天我不得不使用這兩行:KZK1KY011222 MKM012_0122 17 2.1602KZW1KM063603 NTK182_1360 32 2.1419 )。
  • 如果沒有開始和結束的值,它主要適用於 和283640,然後我想借此從最近 DaysYield

我在考慮在Excel/VBA中這樣做,但也想看看R解決方案。任何幫助將不勝感激。

Yield預期成果是根據這個公式計算:

enter image description here

因此,在這種情況下28天,我不得不Yield(28 - 17)*(2.1419-2.1602)/(32-17)+2.1602 = 2.1468

+0

能否請您包括靜態日期點 – OdeToMyFiddle

+0

@hNu的預期收益率向量,編輯我的OP – 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) 

現在先找到間隔,其中需要預測的數值在於:

funfun=function(x){ 
      if(x%in%A$Days)return(A[A$Days==x,3:4]) 
      v=findInterval(x,A$Days);na.omit(A[c(v,v+1),3:4])} 

例如:

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 

接下來我們寫出一個計算預測值的函數:

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謊言天的範圍之外給出的值的我們因此僅服用最後一個值。如果我們有不同的價值呢?說:

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

謝謝。我沒有得到你的第一個輸出 - 「2.14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020」。爲什麼除第一個以外的所有這些數值都是相同的? – AK88

+0

我明白,如果沒有結束的日子,那麼你走最近的。從表格中我們可以看到最後一天是53,所有大於53的日子都會取得53的值。這就是我對你的第3點的理解。如果一天少於4天,它會採取4的收益率值或者我可能不瞭解你的觀點。你可以詳細闡述你的第三點。那就是'funfun1'函數中的if語句 – Onyambu

+0

你也說你會得到不同的結果。請進一步澄清你的問題,你介意顯示預期的結果?以便人們能夠知道他/她的目標是什麼。謝謝 – Onyambu