2016-09-21 2 views
0

zu berechnen Ich habe zwei Spalten/Vektoren und ich möchte den gewichteten Durchschnitt erhalten. Ich habe das gefunden, aber ich kann Lambda nicht zu einem Colum/Vektor ändern.gelten, Mapply? Ich versuche, den gewichteten gleitenden Durchschnitt in R

wma.func = function(rets, lambda) { 
    sig.p = rets[1] 
    sig.s = vapply(rets, function(r) sig.p <<- sig.p*lambda + (r)*(1 - lambda), 0) 
    return(sig.s) 
} 

Ich brauche ungefähr wie folgt aus:

lwma.func = function(rets, wt) { 
    sig.p = rets[1] 
    sig.w = wt[1] ???? 
    print(wt[1:10]) 
    sig.s = vapply(rets, function(r) sig.p <<- sig.p*sig.w + (r)*(1 - sig.w), 0) 
    return(sig.s) 
} 

dass also in jeder Zeile summiert sie die letzten Wert mal das Gewicht dieser speziellen Reihe zuzüglich der Istwert mal eins minus der bestimmten Zeile.

Neben ich verstehe nicht, wie das

function(r) sig.p <<- sig.p*sig.w + (r)*(1 - sig.w) 

Diese Funktion funktioniert? Was bedeutet < < - bedeutet?
Vielen Dank für Ihre Hilfe.

+0

Können Sie ein kleines Beispiel für Beispieldaten mit der gewünschten Ausgabe bereitstellen? – davechilders

Antwort

0

Hier ist ein data.table Art und Weise zu tun, dass:

library("data.table") 
set.seed(4444) 
df <- data.frame(value = round(runif(10, 1 , 1000), 0), 
       weight = round(runif(10, 0.1, 0.99), 2)) 
setDT(df) 

df[, new := shift(x = value, n = 1, type = "lag") * weight + value * (1 - weight)] 

PS Sie können durch Eingabe ?`<<-` den <<- Operator nachschlagen, was man im Grunde sagt, dass es einen Wert für die Umwelt Eltern zuordnet, anstatt nur die Funktion der unmittelbaren Umgebung.

+0

Danke, es hat perfekt funktioniert. Nizza –

+0

UPS !! Bei der Überprüfung der Daten werden die neuen Werte nicht addiert, sondern immer der letzte Wert * Gewicht + tatsächlicher Wert * (1-Gewicht). Aber ich brauche den letzten berechneten "neuen" Wert als Wert. –

+0

Also willst du neu * Gewicht + tatsächlich * (1-Gewicht)? Wenn ja, würden Sie kein "neues" für Ihre erste Reihe haben. – ddunn801

Verwandte Themen