我正在尝试对索赔数据进行惩罚式回归,其中,惩罚式协变量只是起点和发展年份,而没有未惩罚的协变量。在某些情况下,您会遇到负的“ 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不能收敛。我希望引入拟泊松效应会改变这种情况,无论如何,要像这种预先定义的拟泊松效应那样对模型进行惩罚回归?
很抱歉,再次道歉-我对此很陌生!
谢谢!