Как зациклить все значения в кадре данных в качестве начального значения в maxLik

Я делаю оценку максимального правдоподобия, используя 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 и выберите лучший вектор начальных значений после запуска модели из множества начальных параметров.

Спасибо!

2 ответа

Решение

Рассматривать Map (обертка mapply) чтобы передать st столбцы поэлементно через ваши методы. Вот, Map вернет список maxLik объекты, в частности наследуемые объекты класса maxim, содержащие список других компонентов. Количество элементов в этом списке будет равно строкам ст.

Обратите внимание, что входные параметры, a, r и l передаются в начальный аргумент maxLik() и больше не жестко запрограммированные целые числа. И F12 остался нетронутым.

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)

И чтобы ответить на вопрос - лучший вектор начальных значений после запуска модели из множества начальных параметров - требуется определенное определение "лучший". Как только вы определите это, вы можете использовать Filter() в вашем возвращенном списке объектов выберите один или несколько элементов, которые дают это "лучшее".

Ниже приведена демонстрация, позволяющая найти наибольшее значение в максимуме каждого максимального правдоподобия. Используйте оценку, если это необходимо. Обратите внимание, что этот возвращаемый список может иметь более одного, если наибольшее значение совместно используется другими элементами списка:

highest_value <- max(sapply(maxLik_list, function(item) item$maximum))

maxLik_item_list <- Filter(function(i) i$maximum == highest_value, maxLik_list)

Что вы делаете в своей функции logLik, так это то, что вы вычисляете альфа, лямбда, rho, тогда как ваши данные уже имеют их. Это строки с u, p и f12(это также имя вашей функции!). Кроме того, можно рассчитать логарифмическую вероятность для одной строки, так как ваша функция логарифмической вероятности имеет отдельные индексы. Таким образом, вы запускаете код, используя apply, как это

#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
Другие вопросы по тегам