调整日志功能(0)

时间:2018-03-04 13:06:12

标签: r loops regression poisson

我为泊松回归写了一个函数。数据集发现有一些计数数据,其中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)

1 个答案:

答案 0 :(得分:1)

这不是解决方案,只是评论。 从根本上说log(0) = Inf。因此,您可以定义所需的大小/无限大小。例如,您可以将0.00替换为0.000000001或更少的值,即接近零。例如log(1E-99) = -227.9559