我为泊松回归写了一个函数。数据集发现有一些计数数据,其中5个条目是y = 0.我想计算偏差残差,在我的函数中编制公式:
devianceResiduals <- sign(y - fittedValuesFullModell) * sqrt(2 * y *
log(y / fittedValuesFullModell) - 2 *
(y - fittedValuesFullModell))
我的问题是因为log(y = 0)= -inf而得到NaN。因此,尝试编写一个使用2个不同的forumal来计算偏差残差的循环。如果y = 0那么 由于日志规则,公式简化为 - 2 *(y - fittedValuesFullModell))。 如果y> 0我想用我的常规配方。我怎样才能调整我的函数,我在计算devianceResiduals时没有得到NaN? (Sry为德国评论)
data(discoveries)
disc <- data.frame(count=as.numeric(discoveries),
year=seq(0,(length(discoveries)-1),1))
yearSqr <- disc$year^2
poisMod<-function(formula, data){
# Definiere Regressionsformel
form <- formula(formula)
# DataFrame wird erzeugt
model <- model.frame(formula, data = data)
# Designmatrix wird erzeugt
x <- model.matrix(formula, data = data)
# Response Variable erzeugt
y <- model.response(model)
# Designmatrix f?r "Nullmodell-Sch?tzung" (nur Intercept wird gesch?tzt)
# wird erzeugt
xNull <- as.matrix(x[, 1])
# Parameteranzahl die es zu sch?tzen gilt im "Nullmodell"
# (nur Intercept gesch?tzt)
parNullModell <- rep(0, 1)
# Parameteranzahl die es zu sch?tzen gilt im im "Fullmodell" (Fullmodell
# hei?t, dass Koeffizienten f?r jede erkl?rende Variable aus der Formula
# gesch?tzt werden)
parFullModell <- rep(0, ncol(x))
# Funktionaufruf wird gespeichert
call <- match.call()
# Maximierung der Loglikelihood durch Sch?tzung der Koeffzienten, Hessematrix
# soll ebenfalls mit angegeben werden
optimierung <- optim(par = parFullModell, fn = logLike,
x = x, y = y, hessian = TRUE)
# Hessematix aus Optimierung
hesseMatrix <- optimierung$hessian
# Koeffizienten aus der Sch?tzung des "Fullmodells"
koefFullModell <- round(optimierung$par, 4)
# Koeffizienten aus der Sch?tzung des "Nullmodells"
koefNullModell <- round(optim(par = parNullModell, fn = logLike,x = xNull,
y = y, method = "Brent", lower = -1000 ,
upper = 1000)$par, 4)
# Bennenung der Koeffizienten entsprechend ihrer erkl?renden Variablen
names(koefFullModell) <- colnames(x)
# Loglikelihood des "FUllmodells" bestimmt
logLikeFullModell <- logLike(y, x, koefFullModell)
# Loglikelihood des "NullModells"
logLikeNullModell <- logLike(y, xNull, koefNullModell)
# AIC Kriterium f?r das "FullModell"
aic <- round(2 * (logLikeFullModell) + 2 * length(koefFullModell), 1)
# Degrees of freedom vom "Fullmodell"
dofFullModell <- nrow(x) - ncol(x)
#Degrees of freedom vom "Nullmodell"
dofNullModell<- nrow(xNull) - ncol(xNull)
# Fitted values des "Nullmodells"
fittedValuesNullModell <- exp(xNull %*% koefNullModell)
# Fitted values des "Fullmodells"
fittedValuesFullModell <- exp(x %*% koefFullModell)
# Residual deviance bestimmt
residualDeviance <- round(2 * sum(y * log(y / fittedValuesFullModell) -
(y - fittedValuesFullModell),na.rm = TRUE), 1)
# Null deviance bestimmt
nullDeviance <- round(2 * sum(y * log(y / fittedValuesNullModell) -
(y - fittedValuesNullModell),na.rm = TRUE), 1)
# Deviance residuals bestimmt
devianceResiduals <- sign(y - fittedValuesFullModell) * sqrt(2 * y *
log(y / fittedValuesFullModell) - 2 *
(y - fittedValuesFullModell))
# y und fitted values des "Fullmodells" in dataframe gepackt, damit ggplo2
# sp?ter darauf angwendet werden kann, da ggplot2 nicht auf diese Klasse
# poisMod angewendet werden kann
ggPlotData <- data.frame(obs = y, fitted = fittedValuesFullModell)
# Liste mit allen Kennzahlen
result <- list("coefficients" = koefFullModell,
"call" = call,
"aic" = aic,
"dofNullModell" = dofNullModell,
"dofFullModell" = dofFullModell,
"x" = x,
"y" = y,
"fittedValuesNullModell" = fittedValuesNullModell,
"fittedValuesFullModell" = fittedValuesFullModell,
"residualDeviance" = residualDeviance,
"nullDeviance" = nullDeviance,
"hesseMatrix" = hesseMatrix,
"optimierung" = optimierung,
"devianceResiduals" = devianceResiduals,
"ggPlotData" = ggPlotData,
"model" = model)
# poisMod Klasse erzeugt
class(result) <- "poisMod"
# Result liste ausgegeben
return(result)
}
p2 <- poisMod(count~year+yearSqr,data=disc)
答案 0 :(得分:1)
这不是解决方案,只是评论。
从根本上说log(0) = Inf
。因此,您可以定义所需的大小/无限大小。例如,您可以将0.00替换为0.000000001或更少的值,即接近零。例如log(1E-99) = -227.9559