Я должен начать с того, что я пытаюсь сделать: я хочу использовать функцию mle без необходимости переписывать мою функцию правдоподобия журнала каждый раз, когда я хочу попробовать другую спецификацию модели.Поскольку mle ожидает именованный список начальных значений, вы, очевидно, не можете просто написать функцию логарифмического правдоподобия, которая принимает вектор параметров.Простой пример:
Предположим, я хочу подогнать модель линейной регрессии по максимальной вероятности, и сначала я игнорирую один из моих предикторов:
n <- 100
df <- data.frame(x1 = runif(n), x2 = runif(n), y = runif(n))
Y <- df$y
X <- model.matrix(lm(y ~ x1, data = df))
# define log-likelihood function
ll <- function(beta0, beta1, sigma){
beta = matrix(NA, nrow=2, ncol=1)
beta[,1] = c(beta0, beta1)
-sum(log(dnorm(Y - X %*% beta, 0, sigma)))
}
library(stats4)
mle(ll, start = list(beta0=.1, beta1=.2, sigma=1)
Теперь, если я хочуподойдет другая модель, скажем:
m <- lm(y ~ x1 + x2, data = df)
Я не могу повторно использовать свою функцию логарифмического правдоподобия - мне придется переписать ее, чтобы иметь параметр бета3.Я хотел бы сделать что-то вроде:
ll.flex <- function(theta){
# theta is a vector that I can use directly
...
}
, если , тогда я мог бы как-то настроить аргумент start в mle, чтобы учесть мою теперь функцию логарифмического правдоподобия для векторного ввода,или, исключая это, иметь функцию, которая создает функцию правдоподобия во время выполнения, скажем, путем создания именованного списка аргументов и последующего использования его для определения функции, например, что-то вроде этого:
X <- model.matrix(lm(y ~ x1 + x2, data = df))
arguments <- rep(NA, dim(X)[2])
names(arguments) <- colnames(X)
ll.magic <- function(bring.this.to.life.as.function.arguments(arguments)){...}
Обновление:
В итоге я написал вспомогательную функцию, которая может добавить произвольное количество именованных аргументов x1, x2, x3 ... к переданной функции f.
add.arguments <- function(f,n){
# adds n arguments to a function f; returns that new function
t = paste("arg <- alist(",
paste(sapply(1:n, function(i) paste("x",i, "=",sep="")), collapse=","),
")", sep="")
formals(f) <- eval(parse(text=t))
f
}
Это некрасиво, но оно выполнило свою работу, позволив мне на ходу пересмотреть мою функцию логарифмического правдоподобия.