在R中的惩罚包中调用传统模型之外的模型

时间:2018-06-21 13:51:30

标签: r machine-learning regression

我正在尝试对索赔数据进行惩罚式回归,其中,惩罚式协变量只是起点和发展年份,而没有未惩罚的协变量。在某些情况下,您会遇到负的“ y值”,这是一个噩梦,因为链接函数是log。

围绕此问题的一种工作是定义“拟泊松”,我相信David Firth编写了以下代码:

quasipoisson <- function (link = "log")
      ## Amended by David Firth, 2003.01.16, at points labelled ###
      ## to cope with negative y values
      ##
      ## Computes Pearson X^2 rather than Poisson deviance
      ##
      ## Starting values are all equal to the global mean
    {
      linktemp <- substitute(link)
      if (!is.character(linktemp)) {
        linktemp <- deparse(linktemp)
        if (linktemp == "link")
          linktemp <- eval(link)
      }
      if (any(linktemp == c("log", "identity", "sqrt")))
        stats <- make.link(linktemp)
      else stop(paste(linktemp, "link not available for
                      poisson",
                      "family; available links are", "\"identity\", \"log\"
                      and \"sqrt\""))
      variance <- function(mu) mu
      validmu <- function(mu) all(mu > 0)
      dev.resids <- function(y, mu, wt) wt*(y-mu)^2/mu ###
      aic <- function(y, n, mu, wt, dev) NA
      initialize <- expression({
        n <- rep(1, nobs)
        mustart <- rep(mean(y), length(y)) ###
      })
  structure(list(family = "quasipoisson", link = linktemp,
                 linkfun = stats$linkfun, linkinv = stats$linkinv,
                 variance = variance,
                 dev.resids = dev.resids, aic = aic, mu.eta =
                   stats$mu.eta,
                 initialize = initialize, validmu = validmu, valideta =
                   stats$valideta),
            class = "family")
}

这是一种变通方法,在将标准GLM应用于索赔数据时非常有用,即您具有:

model <- glm(claims ~ origin + dev, family = quasipoisson(),
             subset=!is.na(claims), data=dataset)

现在,我有兴趣以类似方式应用惩罚回归,因为日志链接会出现问题,所以我想介绍这个新的家族。我是该领域的新手,但是我已经在R中导入了“ penalized”包,并尝试了以下操作:

GLM_train<-penalized(claims,~origin+dev,unpenalized=~0,data=df_train,model="quasipoisson", lambda2=1)

'df_train'只是一个包含三列的数据框:

'claims'-索赔总额(加三角形)

'origin'-声明来源

'dev'-开发周期(以月为单位)

df_train的示例:

claims<-c(0.000,  8752.912, 16357.009, 20878.468, 22479.931, 21516.718, 22413.001, 22488.901, 21516.718, 23285.851 ,21793.339, 22765.522,
12253.054, 14257.608 ,19807.112 ,21696.767 ,22040.339, 21004.614 ,22061.039 ,22061.039, 20678.934, 21735.359, 20678.934, 21735.359)

origin<-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12)

dev <-c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2)
df_test=data.frame(claims=claims,origin=origin,dev=dev)

我曾尝试使用包装内的模型,但GLM不能收敛。我希望引入拟泊松效应会改变这种情况,无论如何,要像这种预先定义的拟泊松效应那样对模型进行惩罚回归?

很抱歉,再次道歉-我对此很陌生!

谢谢!

0 个答案:

没有答案