Actualización Simon Wood ha corregido este error en mgcv en la versión 1.7-25. La entrada dice:
* bugs fixed whereby etastart etc were not passed to initial.spg and
get.null.coefs.
Hay varios lugares en los que se puede producir un mensaje de error como el que muestras. El primero es en la inicialización de la GAM:
> gaussian()$initialize
expression({
n <- rep.int(1, nobs)
if (is.null(etastart) && is.null(start) && is.null(mustart) &&
((family$link == "inverse" && any(y == 0)) || (family$link ==
"log" && any(y <= 0))))
stop("cannot find valid starting values: please specify some")
mustart <- y
})
Fíjate en la última cláusula: (family$link == "log" && any(y <= 0))
La primera parte de la cláusula es TRUE
en su caso, ¿qué pasa con la segunda parte? Eso fallará, pero la pregunta entonces es, ¿por qué falló como is.null(start)
debería haber sido FALSE
en su caso. Este código se llama en realidad en gam.fit
a través de mgcv:::estimate.gam
y por lo tanto mgcv:::initial.spg
como muestra el traceback()
:
> traceback()
6: stop("cannot find valid starting values: please specify some")
5: eval(expr, envir, enclos)
4: eval(family$initialize)
3: initial.spg(G$X, G$y, G$w, G$family, G$S, G$off, G$L, G$lsp0)
2: estimate.gam(G, method, optimizer, control, in.out, scale, gamma,
...)
1: gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat, family = gaussian(link = "log"),
start = c(1, 2, 3, 4, 5))
Si miramos en mgcv:::initial.spg
observamos estas líneas (ignorar el nobs
uno)
start <- etastart <- mustart <- NULL
nobs <- nrow(X)
eval(family$initialize)
Es decir, el código anterior evalúa la expresión que he mostrado antes. Pero lo hace después de borrar start
.
Creo que se trata de un error ya que no veo cómo se puede encajar el modelo que se quiere con la forma en que está codificado. Por ejemplo, utilizando
library(mgcv)
set.seed(2) ## simulate some data...
dat <- gamSim(1,n=400,dist="normal",scale=2)
b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3), data=dat, start = 1:5)
observamos que eso falla, pero nos indica cuántos valores iniciales hay que proporcionar.
> b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3), data=dat, start = 1:5)
Error in gam.fit(G, family = G$family, control = control, gamma = gamma, :
Length of start should equal 37 and correspond to initial coefs.
OK. Cambia esto por un "log"
enlazar y reajustar con 37 valores de partida
> b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat,
+ family = gaussian(link = "log"), start = runif(37))
Error in eval(expr, envir, enclos) :
cannot find valid starting values: please specify some
y sigue fallando.
Una vez que el autor haya solucionado este problema, todavía tendrá que especificar los valores iniciales correctos para el número de términos en su modelo spline.