Ошибка в optim (start, f, method = method, hessian = TRUE, ...): (список) объект не может быть приведен к типу 'double' - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь оценить параметры, используя максимальное правдоподобие с внутренней подпрограммой, которая решает проблему с фиксированной точкой.

По существу, оцениваемые параметры: альфа, дельта и лямда. Я хочу следующее:

  1. Начальные угадывания параметров для оцениваемых параметров
  2. Используйте угадывание параметров + функцию FixedPoint, чтобы решить для M (который является функцией параметров)
  3. Рассчитайте логарифмическую вероятность для этого
  4. Используйте MLE, чтобы получить новые оценки параметров, которые затем используются в качестве новых догадок для задачи с фиксированной точкой для M
  5. Продолжайте до тех пор, пока алгоритм сходится.

Подробнее о данных: у меня есть смоделированный набор данных для 100 групп по 2 человека в каждой. Логарифмическая вероятность должна быть суммирована по всем лицам во всех группах. Я использую списки, чтобы определить соответствующие матрицы для каждой группы отдельно.

У меня есть следующий код:

neg_LL <- function (alpha, delta, lamda) {

  for (g in 1:G) {

    #Calculate the initial value of M for each group

    Inputs <- matrix(0.5, nrow = N, ncol = 1)
    m_hat <- list()

    C = FixedPoint(x <- function (M) {sigmoid(as.matrix(X[[g]]) %*% alpha + W %*% as.matrix(X[[g]]) %*% delta + lamda*W %*% M)}, Inputs, Method = "Simple")

    m_hat[[g]] <- matrix(C$FixedPoint, ncol = 1)  

    #Calculate the probabilities of y = 1 and y = -1 for each individual in each group

    Phat_1 <-list()
    Phat_minus1 <- list()

    Phat_1[[g]] = 1/(1+ exp(-0.2*(X[[g]] %*% alpha + W %*% X[[g]] %*% delta + lamda * W %*% m_hat[[g]]))) 

    Phat_minus1[[g]] = 1/(1+ exp(0.2*(X[[g]] %*% alpha + W %*% X[[g]] %*% delta + lamda * W %*% 
    m_hat[[g]])))

    #Calculate the LL for each group 

    negLL_g <- list()

    for (i in 1:N)  {
      negLL_g[[g]] = sum(((1+as.matrix(my_data_list[[g]]$Y, ncol = 1)[i,])/2)*log(Phat_1[[g]][i,])
                         + ((1-as.matrix(my_data_list[[g]]$Y, ncol = 1)[i,])/2)*log(Phat_minus1[[g]] 
 [i,]))  
    }}

  #Sum up all the LL's for all the groups to get the neg LL that is to be maximised

  negLL = sum(negLL_g[[g]])

  return(negLL)
}

est <- stats4::mle(minuslog=neg_LL, start=list(alpha = matrix(c(0.025, - 0.02, 0.05), nrow = k), delta = matrix(c(0.05, 0.02, 0.9), nrow = k), 
                                               lamda = 0.5))

summary(est)

Ошибка: я получаю следующую ошибку:

Ошибка в optim (start, f, method = method, hessian = TRUE , ...): (список) объект не может быть приведен к типу 'double'

Что мне делать?

...