2017-04-09 4 views
0

Ich versuche, ein nichtlineares Modell mit fast 50 Variablen anzupassen (da es Jahr feste Effekte gibt). Das Problem ist, ich so viele Variablen, die ich nicht die komplette Formel aufschreiben kann wieNichtlineares Modell mit vielen unabhängigen Variablen (feste Effekte) in R

nl_exp = as.formula(y ~ t1*year.matrix[,1] + t2*year.matrix[,2] 
         +... +t45*year.matirx[,45] + g*(x^d)) 
nl_model = gnls(nl_exp, start=list(t=0.5, g=0.01, d=0.1)) 

wo y ist die binäre Antwortvariable, year.matirx ist eine Matrix von 45 Spalten (was 45 verschiedene Jahre) und x ist die unabhängige Variable. Die zu schätzenden Parameter sind t1, t2, ..., t45, g, d.

Ich habe gute Startwerte für t1, ..., t45, g, d. Aber ich möchte keine lange Formel für diese nichtlineare Regression schreiben.

Ich weiß, dass, wenn das Modell linear ist, kann der Ausdruck

l_model = lm(y ~ factor(year) + ...) 
  1. I factor(year) in gnls Funktion versucht, mit vereinfacht werden, aber es funktioniert nicht.
  2. Außerdem habe ich auch versucht,

    nl_exp2 = as.formula(y ~ t*year.matrix + g*(x^d))

    nl_model2 = gnls(nl_exp2, start=list(t=rep(0.2, 45), g=0.01, d=0.1))

Es kehrt auch mir Fehlermeldung.

Gibt es also eine einfache Möglichkeit, die nichtlineare Formel und die Startwerte in R aufzuschreiben?

+0

Es wäre einfacher zu helfen, wenn Sie ein Beispiel [Beispiel für reproduzierbare Beispiele] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) mit Beispieleingabedaten bereitstellen so können wir den Code tatsächlich ausführen und mögliche Lösungen testen. – MrFlick

Antwort

4

Da Sie keine Beispieldaten zur Verfügung gestellt haben, schrieb ich meine eigenen - es ist völlig sinnlos und das Modell funktioniert eigentlich nicht, weil es schlechte Datenabdeckung hat, aber es erhält den Punkt herüber:

y <- 1:100 
x <- 1:100 
year.matrix <- matrix(runif(4500, 1, 10), ncol = 45) 

start.values <- c(rep(0.5, 45), 0.01, 0.1) #you could also use setNames here and do this all in one row but that gets really messy 
names(start.values) <- c(paste0("t", 1:45), "g", "d") 
start.values <- as.list(start.values) 

nl_exp2 <- as.formula(paste0("y ~ ", paste(paste0("t", 1:45, "*year.matrix[,", 1:45, "]"), collapse = " + "), " + g*(x^d)")) 

gnls(nl_exp2, start=start.values) 

Dies ist möglicherweise nicht der effizienteste Weg, um es zu tun, aber da Sie eine Zeichenfolge an as.formula übergeben können, ist es ziemlich einfach, paste Befehle zu verwenden, um zu konstruieren, was Sie versuchen zu tun.

+0

Vielen Dank! Es ist sehr hilfreich! –

+0

betrachten '' reformulate' ... –

Verwandte Themen