2017-06-26 5 views
0

Ich habe den folgenden Code:Vereinfachen meine Funktion

z7 <- function(data, k, e){ 
    require(zoo) 
    df = data 
    r = df$ROA 
    t = df$t 
    EA = df$EA 
    k = k 
    e = e 

    #Estimate rolling linear models 
    models = rollapply(df, width = k, FUN = function(z) 
    coef(lm(r~t, data = as.data.frame(z))), by.column = FALSE, align ="right") 

    #Extract residuals from the models 
    res = rollapply(df, width= k, FUN = function(x) 
    residuals(lm(r~t, data = as.data.frame(x))), by.column = FALSE, align ="right") 

    #Standard deviation and Mean of residuals, on a row basis 
    s = as.data.frame(apply(res, 1, sd)) 
    m = as.data.frame(apply(res, 1, mean)) #note that this is aproximately 0 due to detrending. 

    #Combine the data define n as number of rows in the dataset 
    dataset = cbind(models, res, m, s) 
    n = as.vector(nrow(dataset)) 
    n 
    dataset 

    #Compute predictions at k+1 
    for(i in n){ 
    x = k + 1 
    preds = dataset$`(Intercept)` + dataset$t*(x) 
    x = x + 1 
    } 

    #Compute coefficient of variation 
    for(j in n){ 
    n2 = k +1 
    tau = ((1 + 1/(4*(n2))) * (dataset$apply.res..1..sd./dataset$apply.res..1..mean.)) 
    } 

    dataset3 = cbind(dataset, tau) 
    dataset3 
    #Compute mean of chi distribution and the adjusted standard deviation 
    Mchi <- sqrt(2)*((gamma((k+1)/2))/gamma(k/2)) 
    S = s*Mchi*(k+1)/sqrt(k) 

    #Compute z7, checking whether the adjusted sd or cv should be used 
    for(i in nrow(dataset3)){ 
    if (abs(dataset3$tau*dataset3$preds) < e) { 
     z = -(dataset3$EA + dataset3$preds)/S 
    } else 
     z = -(dataset3$EA + dataset3$preds) /(dataset3$tau*dataset3$preds) 
    } 
} 

Wie auffällig ist, ich schaffe eine Funktion, die eine angepasste standardisierte Partitur erstellt. Typischerweise ist der Z-Score definiert als (x - Mittelwert)/sd.

In diesem Fall berücksichtigen wir die Tatsache, dass x eine Zufallsvariable ist, die nicht stationär ist. Daher muss das Maß rollierend geschätzt und iterativ über die Anzahl der Beobachtungen konstruiert werden.

df ist der Datensatz von Interesse, k ist die Fensterlänge zur Schätzung der rollenden linearen Modelle, und e ist einfach ein Wert, um zu testen, ob die angepasste Standardabweichung zu klein ist, um den Variationskoeffizienten zu verwenden alternative Standardabweichung, die auf Heteroskedastizität eingestellt ist.

Ich erhalte eine Fehlermeldung, wenn ich meine Funktion mit den folgenden Test Maßnahmen auszuführen:

t = seq(0,15,1) 
r = (100+50*sin(0.8*t)) 
EA = rnorm(0:15) 
df = data.frame(t,r,EA) 

test = z7(df, 3, 0.00000000001) 

Der Fehler ist:

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 14, 0 

Die Zurückverfolgungs ist:

5. 
stop(gettextf("arguments imply differing number of rows: %s", 
    paste(unique(nrows), collapse = ", ")), domain = NA) 
4. 
data.frame(..., check.names = FALSE) 
3. 
cbind(deparse.level, ...) 
2. 
cbind(dataset, tau) 
1. 
z7(df, 3, 1e-11) 

Wie kann ich diesen Fehler beheben? Gibt es auch eine Möglichkeit, meinen Code zu vereinfachen?

Vielen Dank.

Antwort

0

Ich denke, der Fehler in Zeile auftritt

tau = ((1 + 1/(4*(n2))) * (dataset$apply.res..1..sd./dataset$apply.res..1..mean.)) 

ich es

tau = ((1 + 1/(4*(n2))) * (dataset$`apply(res, 1, sd)`/dataset$`apply(res, 1, mean)`)) 

Und in der letzten for Schleife

geändert Ich denke, es gibt ein Problem mit dataset3$preds

>dataset3$preds 
NULL 

Und am Anfang erklärst du r = df$ROA aber ich denke, das setzt r gleich NULL.

Hoffe das war nützlich!

Grüße

WW