无法获得partykit包的mob功能来做单变量MLE适合

时间:2016-03-13 15:37:46

标签: r oop party

我无法获得partykit软件包的mob功能来进行单变量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”的对象上面的错误消息   使用glm而不是fitdistr时不会出现

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

1 个答案:

答案 0 :(得分:4)

原则上,将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×2矩阵。

我认为手动计算伽玛分布的得分函数并不太难。但是这也应该在一些R包中可用,可能是gamlss.dist或其他包。