Объект gls, созданный с помощью функции-оболочки, не может быть предсказан с новыми данными

В следующем примере я использую функцию-оболочку для размещения объекта gls. Я могу успешно вернуть прогноз модели для исходных данных, но не при использовании newdata, который возвращает ошибку «Error in eval(expr, envir, enclos) : 'nthcdr' needs a list to CDR down»:

# library -----------------------------------------------------------------
library(nlme)


# wrapper function --------------------------------------------------------
test.gls <- function(data, ...){
  fit <- gls(data=data, ...)
  return(fit)
}


# make data ---------------------------------------------------------------
set.seed(1)
n <- 20
x <- sort(rlnorm(n, meanlog = 0.25, sdlog = 1.5))
b <- 100
cv <- 0.5
y <- x*b * rlnorm(n, 0, cv)
dat <- data.frame(x,y)


# fit model ---------------------------------------------------------------
fit <- test.gls(data=dat, model=y~x-1, weights=varExp())
class(fit)
# [1] "gls"
plot(y~x, dat)
lines(dat$x, predict(fit)) # works


# prediction --------------------------------------------------------------
newdat <- data.frame(x=sort(rlnorm(n, meanlog = 0.25, sdlog = 1.5)))
pred <- predict(fit)
newpred <- predict(fit, newdata = newdat)
# Error in eval(expr, envir, enclos) : 'nthcdr' needs a list to CDR down

person Marc in the box    schedule 08.03.2016    source источник
comment
Странно... вне вашей функции-оболочки все работает нормально: fit <- gls(y ~ x - 1, data = dat, weights = varExp()); predict(fit, newdat)   -  person Raad    schedule 08.03.2016
comment
да, я тоже это заметил. Эта конкретная ошибка, похоже, как-то связана с синтаксически допустимыми именами. Возможно, это поможет найти проблему.   -  person Marc in the box    schedule 08.03.2016


Ответы (1)


Следующий ответ, по-видимому, дает одно решение с использованием do.call: https://stackoverflow.com/a/7668846/1199289

Пример:

# library -----------------------------------------------------------------
library(nlme)


# wrapper function --------------------------------------------------------
test.gls <- function(data, ...){
  fit <- gls(data=data, ...)
  return(fit)
}
test.gls2 <- function(argList=NULL){
  fit <- do.call("gls", args = argList)
  return(fit)
}


# make data ---------------------------------------------------------------
set.seed(1)
n <- 20
x <- sort(rlnorm(n, meanlog = 0.25, sdlog = 1.5))
b <- 100
cv <- 0.5
y <- x*b * rlnorm(n, 0, cv)
dat <- data.frame(x,y)


# fit model ---------------------------------------------------------------
fit <- test.gls(data=dat, model=y~x-1, weights=varExp())
fit2 <- test.gls2(argList=list(data=dat, model=y~x-1, weights=varExp()))
class(fit)
# [1] "gls"
plot(y~x, dat)
lines(dat$x, predict(fit)) # works


# prediction --------------------------------------------------------------
newdat <- data.frame(x=sort(rlnorm(n, meanlog = 0.25, sdlog = 1.5)))
pred <- predict(fit)
newpred <- predict(fit, newdata = newdat)
# Error in eval(expr, envir, enclos) : 'nthcdr' needs a list to CDR down
newpred2 <- predict(fit2, newdata = newdat) # works
person Marc in the box    schedule 08.03.2016
comment
Я взглянул на код, и проблема связана с методом formula.gls, который представляет собой одну строку eval(x$call$model), теперь, если вы посмотрите на fit$call , он возвращает gls(model = ..1, , что приводит к сбою formula(object) и возвращает ошибку. - person Raad; 08.03.2016