Невозможно получить функцию mob пакета пакета partykit для одномерной подгонки MLE

Я не могу заставить мобильную функцию пакета partykit выполнять одномерную подгонку MLE.

# Trying to convert vignette example here https://cran.r-project.org/web/packages/partykit/vignettes/mob.pdf on page 7 to do univariate MLE gamma fits.  
data("PimaIndiansDiabetes", package = "mlbench")    
library("partykit")     
library("fitdistrplus")    


# Generating some fake data to replace the example data.
op <- options(digits = 3)
set.seed(123)    
x <- rgamma(nrow(PimaIndiansDiabetes), shape = 5, rate = 0.1)
PimaIndiansDiabetes$diabetes<-x
PimaIndiansDiabetes$glucose<-x 

#Hopefully this change to the formula means fit a gamma to just the diabetes vector of values!
pid_formula <- diabetes  ~ 1  | pregnant + pressure + triceps + insulin + mass + pedigree + age    

#Defining my own, negative of log likelihood since mob will minimize it.    
estfun<-function(z) {-logLik(z)} 

#replacing the call to glm that is successful in the vignette example.    
class(fitdistr) <- append(class(fitdistr),estfun)              
logit <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) {
         fitdistr(y, "gamma") 
                  }

#fail! The mob() function still does not see my artificially created estfun().   

pid_tree <- mob(pid_formula, data = PimaIndiansDiabetes, fit = logit) 

Ошибка в UseMethod("estfun"): нет применимого метода для 'estfun', примененного к объекту класса "fitdistr". Приведенное выше сообщение об ошибке не появляется, если вместо fitdistr используется glm

# estfun runs OK outside of call to mob! 
estfun(logit(PimaIndiansDiabetes$diabetes,PimaIndiansDiabetes$glucose)) 

1 ответ

В принципе возможно использование mob() за то, что вы хотите сделать, но есть неправильное понимание того, что estfun() метод должен делать и как он вызывается.

mob() Для построения дерева требуются следующие фрагменты информации из модельного объекта:

  • Расчетные параметры, как правило, извлекаются coef(object),
  • Оптимизированная целевая функция, обычно извлекаемая logLik(object),
  • Оценочные функции, также известные как градиенты, обычно извлекаются estfun(object), Увидеть vignette("sandwich-OOP", package = "sandwich") для введения.

Для объектов класса "fitdistr" первые два доступны, но последний нет:

methods(class = "fitdistr")
## [1] coef   logLik print  vcov  
## see '?methods' for accessing help and source code

Следовательно:

f <- fitdistr(x, "gamma")
coef(f)
## shape  rate 
## 5.022 0.103 
logLik(f)
## 'log Lik.' -3404 (df=2)
sandwich::estfun(f)
## Error in UseMethod("estfun") : 
##   no applicable method for 'estfun' applied to an object of class "fitdistr"

estfun() Функция, которую вы определили, не работает по следующим двум причинам: (1) Это не метод estfun.fitdistr() это может быть вызвано универсальной функцией sandwich::estfun() который используется через пакет NAMESPACE, (2) Он не вычисляет правильную величину: это логарифмическая вероятность, но нам нужна производная логарифмической плотности по обоим параметрам и оцениваемая при каждом наблюдении. Последний будет матрицей n x 2.

Я думаю, что не должно быть слишком сложно вычислить функцию оценки гамма-распределения вручную. Но это также должно быть доступно в некотором пакете R, возможно, gamlss.dist или также другие пакеты.

Другие вопросы по тегам