Нелинейная минимизация (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], я получу ошибку: нечисловой аргумент математической функции

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


person Jespar    schedule 20.02.2017    source источник
comment
Глядя на страницу справки ?nlm, я не вижу аргумента данных. Также подумайте, что список параметров в основном отбрасывал бы любые значения, если бы он не был назван, потому что после (f, p, ...) нет позиционного соответствия.   -  person IRTFM    schedule 20.02.2017
comment
Вы только что подали мне идею, позвольте мне попробовать кое-что. Аргумент данных должен быть dat, за которым следуют параметры. Я помещаю их в nlm в той же последовательности, чтобы соответствовать negbinll   -  person Jespar    schedule 20.02.2017
comment
Хорошо, я чувствую себя совершенно глупо. Я думал, что независимо от последовательности (f, p, ...) функция будет работать. Видимо, я должен был построить первый код так: negbinll <- function(params, dat) вместо dat then params   -  person Jespar    schedule 20.02.2017


Ответы (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
person Sathish    schedule 20.02.2017
comment
Спасибо @Sathish, я тоже только что узнал. Проверьте мой ответ в комментариях под вопросом! - person Jespar; 20.02.2017