Saya ingin menggunakan fungsi mle2 untuk menghasilkan mles untuk parameter bentuk dan skala weibull. Saya telah menulis kode berikut, tetapi mendapatkan kesalahan:

Jadi komponen mana yang NULL dan saya harus ubah ke numerik? Apakah ada masalah lain dengan kode saya untuk mendapatkan mles?

x2<- rweibull(n, shape = 1, scale = 1.5)
library(bbmle)
loglik2 <- function(theta, x){
  shape<- theta[1]
  scale<- theta[2]
  K<- length(theta)
  n<- length(x2)
  out<- rep(0,K)
  for(k in 1:K){
    out[k] <- sum(dweibull(x2, shape, scale, log=TRUE))   
  }
  return(out)
}
theta.start<- c(1, 1.4)
(mod <- mle2(loglik2,start=list(theta.start),data=list(x2)))
Error in validObject(.Object) : 
  invalid class “mle2” object: invalid object for slot "fullcoef" in class "mle2": got class "NULL", should be or extend class "numeric"
1
siegfried 24 Mei 2020, 03:14

1 menjawab

Jawaban Terbaik

Edit komentar Ben Bolkers berikut di bawah ini:

Anda dapat meneruskan parameter satu per satu daripada sebagai vektor atau Anda dapat meneruskan vektor bernama sebagai input sebagai gantinya: lihat argumen vecpar di dokumen (dan gunakan parnames(nllfun) <- ... pada fungsi kemungkinan log negatif Anda).

Melewati parameter individu:

# some example data
library(bbmle)
set.seed(1)
n = 1000
x2 = rweibull(n, shape = 1, scale = 1.5)

Tulis ulang fungsi kemungkinan untuk mengembalikan minus LL

loglik2 = function(shape, scale, x)
  -sum(dweibull(x, shape=shape, scale=scale, log=TRUE))   

Perkiraan: memberi nama parameter awal (juga menetapkan batas parameter yang lebih rendah untuk menghindari peringatan)

mle2(loglik2, start=list(shape=1, scale=1),
     method="L-BFGS-B",lower=list(shape=0, scale=0),
     data=list(x=x2))
#Coefficients:
#   shape    scale 
#1.007049 1.485067 

# you can also use the formula notation 
mle2(x~dweibull(shape=shape, scale=scale),
     start=list(shape=1, scale=1),
     method="L-BFGS-B",lower=list(shape=0, scale=0),
     data=list(x=x2))

Melewati vektor bernama untuk parameter:

Perhatikan juga dalam contoh ini bahwa parameter dipaksa lebih besar dari nol dengan menggunakan tautan log. Dari komentar Ben "Saya mungkin akan merekomendasikan tautan-log daripada batasan kotak" -- ini daripada menggunakan parameter pengoptimalan lower dalam contoh di atas.

loglik2 = function(theta, x)
  -sum(dweibull(x, shape=exp(theta[1]), scale=exp(theta[2]), log=TRUE))   

# set the parameter names & set `vecpar` to TRUE
parnames(loglik2) = c("shape", "scale")
m = mle2(loglik2, 
         start=list(shape=0, scale=0), 
         data=list(x=x2), vecpar=TRUE)
exp(coef(m)) # exponentiate to get coefficients

# or the formula notation
mle2(x~dweibull(shape=exp(logshape),scale=exp(logscale)), 
     start=list(logshape=0, logscale=0),
     data=list(x=x2))

Beberapa komentar pada kode Anda; dari halaman bantuan ?bblme: "Perhatikan bahwa fungsi minuslogl harus mengembalikan kemungkinan log negatif" yang tidak dimiliki oleh Anda, dan parameter start harus berupa daftar bernama.

2
user20650 24 Mei 2020, 02:08