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.