2016-07-20 14 views
1

Ich habe einen Datensatz archivo die Preise von Anleihen für jede Dauer der Regierung Auktionen enthalten seit 2003. Die ersten Reihen sind:Fitting logarithmische Kurve in einem Datensatz

 Fecha 1 2 3 4 5  6 7 8  9 10 11 12 18 24 
2003-01-02 NA NA NA NA NA 44.9999 NA NA 52.0002 NA NA NA NA NA 
2003-01-03 NA NA NA NA NA  NA NA NA  NA NA NA NA NA NA 
2003-01-06 NA NA NA NA NA  NA NA NA  NA NA NA NA NA NA 
2003-01-07 NA NA NA NA NA 40.0000 NA NA 45.9900 NA NA NA NA NA 
2003-01-08 NA NA NA NA NA  NA NA NA  NA NA NA NA NA NA 
2003-01-09 NA NA NA NA NA 37.0000 NA NA 41.9999 NA NA NA NA NA 

Jede Spalte 1 bis 24 entspricht benannt eine andere Dauer. (1 Monat, 2 Monate, ..., 24 Monate). Nicht alle Dauern werden am Auktionsdatum verkauft. Deshalb habe ich NA s.

Ich brauche die NA s (fehlende) Raten mit einer Log-Fit-Kurve für jede Zeile, die mindestens mehr als 1 Wert hat. Für die Zeilen, die alle NA s haben, kann ich nur die vorher erstellte Kurve verwenden.

Ich bin bewusst, dass ich einen Code wie laufen konnte:

x<-colnames(archivo[,-1]) # to keep the durations 
y<-t(archivo[1,-1]) 
estimacion<-lm(y ~ log(x)) 
param<-estimacion$coefficients 

und erhalten die Koeffizienten für die erste Reihe. Dann führe eine Schleife aus und mach das für jede Zeile.

Gibt es eine Möglichkeit, es direkt mit dem gesamten Dataset zu tun und die Parameter jeder Zeile (jede Log-Anpassung) zu erhalten, ohne eine Schleife zu machen?

Hoffe die Frage ist klar genug.

Vielen Dank im Voraus!

Antwort

1

Versuche:

dat <- as.data.frame(t(archivo[,-1])) ## transpose you data frame 

## a function to fit a model `y ~ log(x)` for response vector `y` 
fit_model <- function (y) { 
    non_NA <- which(!is.na(y)) ## non-NA rows index 
    if (length(non_NA) > 1) { 
    ## there are at least 2 data points, a linear model is possible 
    lm.fit(cbind(1, log(non_NA)), y[non_NA])$coef 
    } else { 
    ## not sufficient number of data, return c(NA, NA) 
    c(NA, NA) 
    } 
    } 

## fit linear model column-by-column 
result <- sapply(dat, FUN = fit_model) 

Bitte beachte, dass ich lm.fit() verwende, die Kernel-Anpassungsroutine von lm() genannt. Lesen Sie ?lm.fit, wenn Sie nicht damit vertraut sind. Es braucht 2 wesentliche Argumente:

  • Die erste ist die Modellmatrix. Die Modellmatrix für Ihr Modell y ~ log(x) lautet matrix(c(rep(1,24), log(1:24)), ncol = 2). Sie können es auch über model.matrix(~log(x), data = data.frame(x = 1:24)) erstellen.
  • Der zweite ist der Antwortvektor. Für Sie Problem ist es eine Spalte von dat.

Im Gegensatz zu lm() die NA umgehen kann, lm.fit() nicht. Also müssen wir NA Zeilen aus Modellmatrix und Antwortvektor selbst entfernen. Die non_NA Variable tut dies. Beachten Sie, dass Ihr Modell y ~ log(x) 2 Parameter/Koeffizienten enthält, so dass mindestens 2 Daten für die Anpassung benötigt werden. Wenn nicht genügend Daten vorhanden sind, ist die Anpassung des Modells unmöglich und wir geben c(NA, NA) zurück.

Schließlich verwende ich sapply(), um ein lineares Modell Spalte für Spalte anzupassen, die Koeffizienten nur durch $coef behalten.

-Test

ich die Beispiel Zeilen bin mit Ihnen in Ihrer Frage gestellt. Unter Verwendung des obigen Code, erhalte ich:

#   V1 V2 V3  V4 V5  V6 
# x1 14.06542 NA NA 13.53005 NA 14.90533 
# x2 17.26486 NA NA 14.77316 NA 12.33127 

Jede Spalte Koeffizienten für jede Spalte von dat gibt (oder jede Reihe von archivo).


aktualisieren

Ursprünglich verwendete ich matrix(rep(1,24), log(1:24))[non_NA, ] für Modellmatrix in lm.fit(). Dies ist jedoch nicht effizient. Er erzeugt zuerst die vollständige Modellmatrix und dann Zeilen mit NA. Ein doppelter Gedanke zeigt, dass dies besser ist: cbind(1, log(non_NA)).

+0

Netter Ansatz. Obwohl gibt mir: Fehler in lm.fit (Matrix (c (rep (1, 24), log (1:24)), ncol = 2) [non_NA,],: inkompatible Abmessungen –

+0

Great Job Ist das, was ich gesucht habe. Danke. Jetzt kann ich die Kurven für jedes Auktionsdatum berechnen. Für die fehlende Auktion werde ich vorangehen. Nette Arbeit! –

+0

Oh Entschuldigung! Wusste nicht, dass ich bereits 15 Wiederholungen habe Natürlich! Ich mache es gerade. Danke Li –