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语句,你说你得到了不同的结果。请进一步澄清您的问题,您是否介意显示预期结果?这样你就能知道自己的目标是什么。非常感谢。