Нелинейная минимизация (nlm) в R с ошибкой: неверное количество измерений

У меня есть этот код, где он рассчитывает отрицательное биномиальное распределение, с параметрами:

ce <- c(0, 1, 2, 3, 4, 5)
ce <- as.integer(ce)
comp <- c(257, 155, 64, 17, 5, 2)
comp <- as.integer(comp)
data.cells <- data.frame(ce, comp)

params <- c(5, 1.5) # vector of 2 params, x and κ. 
dat <- data.cells

И функция:

negbinll <- function(dat,params) {
  if (missing(dat)||missing(params)) {
    print('Plese add values for the model')
  } else if (params[1]<0||params[2]<0) {
    print('Plese make sure your parameters are >0')
  } else {
    p <- params[1]/(params[1]+params[2])
    N <- params[1] + dat[,1] - 1
    log.l <- sum(dat[2]*dnbinom(dat[,1], size = N, prob = p, log = TRUE))
    return(log.l)
  }
}

Теперь результат из этого кода

> negbinll(dat, params)
[1] -591.024

Следующим шагом является использование nlm (Нелинейная минимизация), чтобы найти оценки максимального правдоподобия x и κ, предположим, что params = (x, κ)

nlm(negbinll, dat, p = params)
Error in dat[, 1] : incorrect number of dimensions

Но, если я изменяю в исходной функции dat[,1] на dat[1], я получаю ошибку: нечисловой аргумент математической функции

Какие-либо предложения? Спасибо

1 ответ

Решение

dat а также params значения совпадают неправильно внутри negbinll функция. Чтобы отладить его, поставьте browser() внутри negbinll функция и вызвать nlm строка кода. В режиме отладки вы можете распечатать значения dat а также params и увидите, что они не соответствуют должным образом.

Примечание: после отладки удалите browser() команда от negbinll функция

negbinll <- function(dat,params) {
  browser()
  if (missing(dat)||missing(params)) {
    print('Plese add values for the model')
  } else if (params[1]<0||params[2]<0) {
    print('Plese make sure your parameters are >0')
  } else {
    p <- params[1]/(params[1]+params[2])
    N <- params[1] + dat[,1] - 1
    log.l <- sum( dat[2] *dnbinom(dat[,1], size = N, prob = p, log = TRUE))
    return(log.l)
  }
}

Browse[2]> params
# ce comp
# 1  0  257
# 2  1  155
# 3  2   64
# 4  3   17
# 5  4    5
# 6  5    2
Browse[2]> dat
# [1] 5.0 1.5
Другие вопросы по тегам