построение логарифмической функции правдоподобия в R

Привет, я получил ошибку длины x и y в моем коде. datasim — это смоделированная выборка размером 1000. Пожалуйста, помогите мне с этим.

x <- datasim
loglik <- function(theta){
  k<- theta[1]
  lambda<- theta[2]
  out <- sum(dweibull(x,shape = k, scale=lambda, log = TRUE) )
  return(out)
}

theta<- c(0.5,1.5)
plot(theta, loglik(theta), type="l", lwd=3, main="logliklihood_Weibull, n=1000")


person siegfried    schedule 23.05.2020    source источник
comment
Чтобы сделать ваш вопрос воспроизводимым и, следовательно, ответным, нам нужен минимальный автономный код и данные, чтобы мы могли воспроизвести вашу проблему на нашем компьютере, пожалуйста, следуйте этим простым рекомендациям: stackoverflow.com/questions/5963269/.   -  person jay.sf    schedule 23.05.2020
comment
В показанном вами случае ваша функция принимает вектор длины 2 и возвращает вектор длины 1, поскольку суммирование дает вам только одно значение. Поэтому, используя plot(theta, loglik(theta), type="l", lwd=3, main="logliklihood_Weibull, n=1000"), вы пытаетесь построить график x длины 2 (theta) против y длины 1 (loglik(theta)).   -  person Martin Gal    schedule 23.05.2020
comment
theta — это вектор длины 2, поэтому лучше нарисовать трехмерный график поверхности в плоскости xy, где ось x — это параметр формы, а ось y — масштабный параметр распределения Вейбулла. Таким образом, вы можете легко наблюдать за MLE.   -  person Darren Tsai    schedule 23.05.2020
comment
@MartinGal, спасибо за совет. У меня был аналогичный пример использования optim() для поиска mles двухпараметрического dsn с loglik. Так что я не знал о несоответствии размеров.   -  person siegfried    schedule 23.05.2020


Ответы (1)


Вы можете использовать пакет, так как это weibull, который вам подходит:

library(fitdistrplus)
x = rweibull(1000,20,10)
fit <- fitdist(x, "weibull")
llplot(fitg, expand=5)

введите здесь описание изображения

Или используя вашу функцию loglik:

library(lattice)

da = expand.grid(k=seq(8,22,length.out=50),
lambda = seq(9,12,length.out=50))
da$LL = apply(da,1,loglik)

wireframe(LL ~ k * lambda, data = da,
scales = list(arrows = FALSE),drape = TRUE, colorkey = TRUE)

введите здесь описание изображения

person StupidWolf    schedule 23.05.2020