Esto me molestaba, así que decidí trabajar desde los primeros principios.
Vuelva a ajustar el modelo:
d <- data.frame(weight=
c(ctl=c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14),
trt=c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)),
group=gl(2,10,20, labels=c("Ctl","Trt")))
lm.D9 <- lm(weight ~ group, d)
valores devueltos por métodos de acceso estándar:
(AIC1 <- AIC(lm.D9))
> 46.17468
(LL1 <- logLik(lm.D9))
> -20.08824 (df=3)
reconstruir a partir de primeros principios:
n <- nrow(d)
ss0 <- summary(lm.D9)$sigma
ss <- ss0*(n-1)/n
(LL2 <- sum(dnorm(d$weight,fitted(lm.D9),
sd=ss,log=TRUE)))
> -20.08828
Esta es una pequeña poco fuera , no he encontrado el fallo.
Número de parámetros:
npar <- length(coef(lm.D9))+1
(AIC2 <- -2*LL2+2*npar)
> 46.1756
Aún fuera por más de pelusa numérica, pero sólo alrededor de una parte en un millón.
Ahora vamos a ver lo que está haciendo stepAIC
:
MASS::stepAIC(lm.D9) ## start: AIC = -12.58
extractAIC(lm.D9) ## same value (see MASS::stepAIC for details)
stats:::extractAIC.lm ## examine the code
RSS1 <- deviance(lm.D9) ## UNSCALED sum of squares
RSS2 <- sum((d$weight-fitted(lm.D9))^2) ## ditto, from first principles
AIC3 <- n*log(RSS1/n)+2*2 ## formula used within extractAIC
se puede trabajar la fórmula utilizada por encima de Sigma-hat = RSS/n - o ver Venables y Ripley MASAS para la derivación.
añadir términos que faltan: parámetro de varianza no se cuentan, además de constantes
(AIC3 + 2 - 2*(-n/2*(log(2*pi)+1)))
normalización Este es exactamente el mismo (a 1e-14) como AIC1
anterior
Tiene perfecto sentido. Me doy cuenta del factor constante. ¡Gracias! ¿Alguna razón particular para la existencia de una constante arbitraria? – FMZ