R 在两个动态日之间插值

R 在两个动态日之间插值,r,dataframe,interpolation,R,Dataframe,Interpolation,我们有一个每周更新的文件,其结构如下: 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

我们有一个每周更新的文件,其结构如下:

      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
我有以下静态数据点(天),我每周需要
收益率

28
91
182
273
364
730
1825
2555
3640
文件更新后,数据结构也会发生变化(按
天数排序)。有几种可能的情况:

  • 如果数据的
    Days
    列中的值等于 我的
    静态数据中的值,然后我想取相应的
    来自
    产量
    列的值
  • 否则,我想从
    并得到插值的
    收益率
    (例如,对于我的静态
    28
    天 在这个特殊情况下,我必须使用这两行:
    kzk1ky011222mkm012_0122 17 2.1602
    KZW1KM063603 NTK182_1360 32 2.1419
  • 如果没有起始值或结束值,哪一个最适用 到
    28
    3640
    ,然后我想从最近的
我正在考虑在Excel/VBA中执行此操作,但也希望看到R解决方案。任何帮助都将不胜感激

产量的预期产量
根据以下公式计算:

因此,在这种情况下,对于
28
天,我将拥有
收益率
(28-17)*(2.1419-2.1602)/(32-17)+2.1602=2.1468

 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])}
例如:

接下来,我们编写一个计算预测值的函数:

 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
我们看到数据中已经存在的那些值,我们得到了它们的收益率。对于上述数据,我们获得数据中的最后收益率,以及我们根据需要估计的介于两者之间的收益率

希望这会有所帮助

现在首先找到要预测的值所在的区间

 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])}
例如:

接下来,我们编写一个计算预测值的函数:

 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
我们看到数据中已经存在的那些值,我们得到了它们的收益率。对于上述数据,我们获得数据中的最后收益率,以及我们根据需要估计的介于两者之间的收益率


希望这会有所帮助

您能在静态日期包含预期收益率向量吗points@hNu,编辑了我的操作手册,请您将静态日期的预期收益率向量包括在内points@hNu,编辑了我的个人资料,谢谢。我没有得到你的第一个输出--
2.14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020
。为什么除了第一个之外,所有这些值都是相同的?我知道,如果没有结束日,那么就取最接近的值。从表中,我们看到最后一天是53,所以所有大于53的日子都取53。。我就是这样理解你的第三点的。如果一天少于4天,则收益率值为4。或者我不明白你的意思。你可以进一步阐述你的第3点。那就是
funfun1
函数中的if语句,你说你得到了不同的结果。请进一步澄清您的问题,您是否介意显示预期结果?这样你就能知道自己的目标是什么。谢谢,谢谢。我没有得到你的第一个输出--
2.14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020
。为什么除了第一个之外,所有这些值都是相同的?我知道,如果没有结束日,那么就取最接近的值。从表中,我们看到最后一天是53,所以所有大于53的日子都取53。。我就是这样理解你的第三点的。如果一天少于4天,则收益率值为4。或者我不明白你的意思。你可以进一步阐述你的第3点。那就是
funfun1
函数中的if语句,你说你得到了不同的结果。请进一步澄清您的问题,您是否介意显示预期结果?这样你就能知道自己的目标是什么。非常感谢。