2017-08-17 3 views
0

Wir haben eine Datei, die jede Woche und seine Struktur aktualisiert wird, ist wie folgt:Interpolation zwischen zwei dynamischen Tage

 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 

Ich habe folgende statische Datenpunkte (Tage), für die ich Yields auf wöchentlicher Basis benötigen :

28 
91 
182 
273 
364 
730 
1825 
2555 
3640 

Wenn die Datei, ändert sich die Struktur der Daten aktualisiert wird, auch (sortiert nach Days). Es gibt mehrere mögliche Szenarien:

  • Wenn der Wert in Days Spalte der Daten gleich einem der Werte in meinem Static Daten, dann würde Ich mag den entsprechenden Wert von Yield Spalte nehmen.
  • Andernfalls würde Ich mag die engstenen oberen und untere Werte nehmen von Days und Yield interpoliert erhalten (zB für meine statischen 28 Tage in dieser speziellen Fall ich diese beiden Reihen verwenden müsste. KZK1KY011222 MKM012_0122 17 2.1602 und KZW1KM063603 NTK182_1360 32 2.1419).
  • Wenn es keinen Anfang und kein Endwerte, die meist anwendbar zu 28 und 3640, dann nehme ich möchte die Yield vom nächsten Days.

Ich dachte darüber nach, es in Excel/VBA zu tun, würde aber auch gerne R-Lösung sehen. Jede Hilfe würde sehr geschätzt werden.

Erwartete Ausgabe für Yield berechnet wird nach dieser Formel:

enter image description here

Also in diesem Fall für 28 Tage würde ich Yield(28 - 17)*(2.1419-2.1602)/(32-17)+2.1602 = 2.1468

+0

Könnten Sie bitte die erwartete Ausbeute Vektor an statischen Datum Punkte – OdeToMyFiddle

+0

@hNu, bearbeitet meine OP umfassen – AK88

Antwort

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) 

nun zuerst das Intervall finden, wo der zu prognostizierende Wert liegt

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])} 

zB:

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 

Als nächstes schreiben wir eine Funktion, die den vorhergesagten Wert berechnet:

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 

Die meisten der in K liegen angegebenen Werte außerhalb des Bereichs der Tage, die wir so haben nur unter der letzte Wert Was wäre, wenn wir unterschiedliche Werte hätten? sagen wir:

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 

Wir sehen für diese Werte bereits in den Daten, wir erhalten ihre Erträge. Über den Daten erhalten wir den letzten Ertrag in den Daten und diejenigen dazwischen, die wir als erforderlich schätzen.

Hope this helfen

+0

es Ihnen danken. Ich habe Ihre erste Ausgabe nicht bekommen - "2,14678 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020 2.12020". Warum sind alle diese Werte bis auf den ersten identisch? – AK88

+0

Ich habe verstanden, wenn es keine Endtage gibt, dann nimmst du am nächsten. Und vom Tisch sehen wir, dass der letzte Tag 53 ist, also werden alle Tage, die größer als 53 sind, den Wert von 53 annehmen. So habe ich deinen Aufzählungspunkt 3 verstanden. Und wenn ein Tag weniger als 4 Tage ist, wird es sein nehmen Sie den Ertragswert von 4. Oder vielleicht habe ich Ihren Standpunkt dazu nicht verstanden. Sie können näher auf Ihren Punkt Nr. 3 eingehen. Das ist die if-Anweisung in der 'funfun1'-Funktion. – Onyambu

+0

Auch Sie sagen, Sie erhalten unterschiedliche Ergebnisse. Bitte klären Sie Ihr Problem, würden Sie gerne die erwarteten Ergebnisse zeigen? damit man wissen kann, worauf er/sie zielt. Vielen Dank – Onyambu

Verwandte Themen