我正在使用maxLik
进行最大似然估计,这需要指定起始值。有没有什么方法可以让我使用矩阵中的所有值作为起始值,而不是指定单个值?
我目前的maxLik
代码是:
f12 <- function(param){
alpha <- param[1]
rho <- param[2]
lambda <- param[3]
u <- 0.5*(p12$v_50_1)^alpha + 0.5*lambda*(p12$v_50_2)^alpha
p <- 1/(1 + exp(-rho*u))
f <- sum(p12$gamble*log(p) + (1-p12$gamble)*log(1-p))}
ml <- maxLik(f12, start = c(alpha = 1, rho=2, lambda = 1), method = "NM")
我创建了一个具有潜在起始值的上限和下限的数据框:
st <- expand.grid(alpha = seq(0, 2, len = 100),rho = seq(0, 1, len = 100),lambda = seq(0,2, length(100))
我的函数中有3个参数,我的目标是循环上面数据框st
中的所有值,并在从各种起始参数运行模型后选择最佳的起始值向量。
谢谢!
答案 0 :(得分:2)
考虑Map
(mapply
的包装器)以通过方法元素方式传递 st 列。这里,Map
将返回maxLik
个对象的列表,特别是包含其他组件列表的继承的maxim类对象。此列表中的项目数等于 st 的行数。
注意输入参数 a , r 和 l 被传递到{{1}的 start 参数并且不再是硬编码的整数。并且 f12 保持不变。
maxLik()
要回答问题 - 从各种起始参数运行模型后的最佳起始值向量 - 需要特定的&#34; best&#34;。一旦定义了这个,就可以在返回的对象列表中使用maxLik_run <- function(a, r, l) {
tryCatch({
f12 <- function(param){
alpha <- param[1]
rho <- param[2]
lambda <- param[3]
u <- 0.5*(p12$v_50_1)^alpha + 0.5*lambda*(p12$v_50_2)^alpha
p <- 1/(1 + exp(-rho*u))
f <- sum(p12$gamble*log(p) + (1-p12$gamble)*log(1-p))
}
return(maxLik(f12, start = c(alpha = a, rho = r, lambda = l), method = "NM"))
}, error = function(e) return(NA))
}
st <- expand.grid(alpha = seq(0, 2, len = 100),
rho = seq(0, 1, len = 100),
lambda = seq(0, 2, length(100)))
maxLik_list <- Map(maxLik_run, st$alpha, st$rho, st$lambda)
来选择产生这个&#34; best&#34;的一个或多个元素。
以下是在每个最大可能性最大值中找到最高值的演示。如果需要,请使用估算。请注意,如果其他列表项共享最高值,则此返回列表可以包含多个列表:
Filter()
答案 1 :(得分:1)
你在logLik函数中所做的是你正在计算alpha,lambda,rho而你的数据已经有了它们。这些是带有u,p和f12的行(这也是你的函数名!)。此外,由于对数似然函数具有单个索引,因此可以计算一行的对数似然。所以你使用像这样的
运行代码#create a function to find mle estimate for first row
maxlike <- function(a) {
f12 <- function(param){
alpha <- param[1]
rho <- param[2]
lambda <- param[3]
#u <- 0.5*(p12$v_50_1)^alpha + 0.5*lambda*(p12$v_50_2)^alpha
#p <- 1/(1 + exp(-rho*u))
#f12 <- sum(p12$gamble*log(p) + (1-p12$gamble)*log(1-p))
}
ml <- maxLik(f12, start = c(alpha = 1, rho=2, lambda = 1), method = "NM")
}
#then using apply with data = st, 2 means rows and your mle function
mle <- apply(st,2,maxlike)
mle