2012-04-10 10 views
0

Ich versuche eine Methode zu finden, um die Anzahl der Elemente von Vektoren zu erhöhen, um den Winkeleffekt sichtbar zu entfernen, wenn ich die Werte dieser Vektoren plotten. Zum Beispiel, sagen wir, ich habe zwei Vektoren, die 10 Elemente, die jeweils:Erhöhung Vektorauflösung in R

a = c(4,2,10,5,3,4,8,9,6,2) 
b = seq(0,4.5, by=0.5) 

Sie unterliegen Datenglättung, aber ich möchte ihre „Auflösung“ erhöhen, um mehr Vorhersage Punkte als 10 (die Länge) zu erhalten. Also, mit anderen Worten, nehmen Sie den Vektor ein und doppelt (zum Beispiel) seine Anzahl von Elementen, während seine Konsistenz zu halten. Der resultierende Vektor sollte etwas sein wie:

a = c(4,3,2,6,10,7,5,4,3,4,6,8,8.5,9,7.5,6,4,2,2) 

Natürlich, in diesem speziellen Fall, ich leicht den Durchschnitt der Elemente paarweise berechnen kann. Aber ich hätte gerne eine verallgemeinerte Methode für eine beliebige Länge. Ich habe versucht, mit:

seq(a[1],a[10], length.out=20) 

aber natürlich nicht die Arbeit macht als nur das erste und das letzte Element des Vektors in Betracht gezogen werden. Es eignet sich jedoch für den zweiten Vektor b (der die Abszissenwerte enthält). Jede Hilfe wäre willkommen. Vielen Dank. Marius.

+0

Es ist nicht ganz klar, was Sie unter "Konsistenz halten" verstehen? Passen Sie einfach in die Min- und Max-Werte von a? – Hansi

+0

Sie können entweder 'splinefun' oder' carfun' mögen. –

+0

Nein, um zwei aufeinanderfolgende Elemente von Vektor * a * zu erhalten und zwischen ihnen weitere 2 oder 3 oder ... egal Elemente hinzuzufügen, die gleichmäßig verteilt sind, aber den Trend der Vektor. Zum Beispiel, wenn anfänglich a [5] = 4 und a [6] = 7 und a [7] = 5, und ich füge weitere 2 Elemente zwischen a [5] und a [6] und zwischen a [6] und a [ 7] das Stück eines Vektors sollte a1 [5] = 4 sein; a1 [6] = 5, a1 [7] = 6, a1 [8] = 7, a1 [9] = 6,34, a1 [10] = 5,68, a1 [11] = 5 mit dem Anfangsbuchstaben a [5] = a1 [5], a [6] = a1 [8] und a [7] = a1 [11] – Marius

Antwort

2

Möchten Sie nur lineare Interpolation basierend auf der b Sequenz?

f <- approxfun(b, a) 
f(seq(b[1], b[length(b)], length = 20)) 
[1] 4.000000 3.052632 2.105263 5.368421 9.157895 8.157895 5.789474 4.368421 3.421053 3.263158 3.736842 4.842105 6.736842 8.157895 8.631579 8.684211 7.263158 5.789474 
[19] 3.894737 2.000000 

Siehe ?approx für andere Optionen und ihre See also für andere Formen der Interpolation, auch ?round zum Abrunden der Werte auf verschiedene Weise aus.

+0

Nein, ich habe bereits eine lineare Interpolation mit der Funktion seq() erhalten, aber die meisten meiner Daten beschreiben eine quadratische Kurve, deshalb habe ich angegeben, dass ich die Konsistenz des Vektors beibehalten möchte. Aber ich schaue mir die Runde an. – Marius

+0

Sie könnten überrascht sein, wie gut approach oder splinefun mit Ihren Daten nur mit den Standardeinstellungen übereinstimmen, besonders wenn Sie die Anzahl der Punkte erhöhen - nicht sicher, was Sie sonst mit "Konsistenz" meinen. – mdsumner

+0

Von dem, was ich sehe, macht die approfun den Deal. Danke für ihre schnelle Antwort. Ich habe auch splinefun benutzt, aber ich brauchte ein benutzerdefiniertes Verhalten für eine Spline-Funktion, deshalb habe ich meine eigene erstellt. Auch hier erzeugt approfun die gewünschten Ergebnisse. Vielen Dank! – Marius