2017-02-20 2 views
2

У меня есть этот код, где он вычисляет отрицательное биномиальное распределение, с параметрами:Нелинейная Минимизация (НМГ) в 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 (Non-Linear Минимизация), чтобы найти максимальные оценки правдоподобия х и х, предположим Params = (X, κ)

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

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

Любые предложения? Thanks

+1

Глядя на 'nlm' странице помощи, я не вижу аргумент данных. Также подумайте, что список параметров будет в основном выкидывать любые значения, если он не был назван, потому что не существует позиционного соответствия после '(f, p, ...)' –

+0

Вы просто дали мне идею, позвольте мне попробовать что-то. Аргумент данных, который, как предполагается, должен следовать за параметрами. Я помещал их в nlm на той же последовательности, чтобы соответствовать negbinll – Jespar

+0

Хорошо, я чувствую себя совершенно глупо. Я думал, что независимо от последовательности '(f, p, ...), функция будет работать. По-видимому, мне следовало написать первый код: 'negbinll <- function (params, dat)' вместо dat, а затем params – Jespar

ответ

2

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 
+0

Спасибо @Sathish, я просто узнал об этом. Проверьте мой ответ на комментарии ниже вопроса! – Jespar

Смежные вопросы