2016-07-20 15 views
2

Ich würde gerne wissen, wie die Maximum-Likelihood-Schätzung in R zu tun, wenn Fitting-Parameter in einem Array gegeben sind. Dies ist erforderlich, wenn die Anzahl der Parameter groß ist. Also im Grunde eine normale Verteilung auf die Daten x passen, würde Ich mag so etwas wie die folgendenMLE-Funktion mit Array von Parametern

LL <- function(param_array) { 
    R = dnorm(x, param_array[1], param_array[2]) 
    -sum(log(R)) 
} 

mle(LL, start = list(param_array = c(1,1))) 

(Anstelle dieser ursprünglichen Codes im ersten Abschnitt von http://www.r-bloggers.com/fitting-a-model-by-maximum-likelihood/) tun, wenn ich den Code oben Ich lief Einen Fehler

Fehler in dnorm erhalten (x, param_array [1], param_array [2]): Argument "param_array" fehlt, ohne Standard

jemand m lassen konnte Ich weiß, wie ich das erreichen kann, was ich will.

+0

Was machen die Leute, wenn sie 50 Parameter haben? Geben sie sie mit der Hand ein? – user113988

+0

konnte man '? Bbmle :: mle2' und das' vecpar' Argument sehen ... –

Antwort

1

stats4::mle ist keine lange Funktion, können Sie es in Ihrem R-Konsole überprüfen können:

> stats4::mle 

Hinweis, wie start behandelt wird:

start <- sapply(start, eval.parent) 
nm <- names(start) 

Fall 1

Wenn Sie tun:

LL <- function(mu, sigma) { 
    R = dnorm(x, mu, sigma) 
    -sum(log(R)) 
} 

mle(LL, start = list(mu = 1, sigma = 1)) 

Sie erhalten:

nm 
#[1] "mu" "sigma" 

Auch

formalArgs(LL) 
#[1] "mu" "sigma" 

Fall 2

Wenn Sie das tun:

LL <- function(param_array) { 
    R = dnorm(x, param_array[1], param_array[2]) 
    -sum(log(R)) 
} 

mle(LL, start = list(param_array = c(1,1))) 

Sie erhalten

nm 
#[1] NULL 

aber

formalArgs(LL) 
#[1] param_array 

Das Problem

Die Bewertung der Funktion LL innen stats::mle ist durch nm auf die formalen Argumente von LL entsprechen. In Fall 1, gibt es keine Schwierigkeit bei der Zuordnung, aber in Fall 2 erhalten Sie keine Übereinstimmung, daher werden Sie LL nicht bewerten.


Also, was tun die Menschen, wenn sie wie 50 Parameter haben? Geben sie sie mit der Hand ein?

Ist das nicht ein falsches Argument, nach einer sorgfältigen Reflexion?Wenn Sie wirklich 50 Parameter haben, spart Ihnen die Verwendung eines Arrays wirklich Ihren Aufwand?

Zuerst in Ihrer Funktion LL, müssen Sie angeben, param_array[1], param_array[2], ..., param_array[50], das heißt, Sie müssen noch die manuelle Eingabe 50 Parameter in die richtigen Positionen. Während Sie start angeben, müssen Sie immer noch einen length-50 vector Element für Element eingeben, richtig? Ist das nicht die gleiche Menge an Arbeit, verglichen mit der Verwendung eines Arrays, aber einer Liste?

Verwandte Themen