Как извлечь аргументы, используемые в подогнанной модели nls, для использования во второй подгонке с помощью do.call

Я пытаюсь использовать те же исходные аргументы из подогнанной модели nls при подборе второй модели с использованием подмножества данных (для перекрестной проверки). Я могу получить аргументы (например, fit$call), но мне трудно передать эти аргументы do.call.

# original model ----------------------------------------------------------
# generate data
set.seed(1)
n <- 100
x <- sort(rlnorm(n, 1, 0.2))
y <- 0.1*x^3 * rlnorm(n, 0, 0.1)
df <- data.frame(x, y)
plot(y~x,df)

# fit model
fit <- nls(y ~ a*x^b, data=df, start=list(a=1,b=2), lower=list(a=0, b=0), algo="port")
summary(fit)
plot(y~x,df)
lines(df$x, predict(fit), col=4)



# perform model fit on subset with same starting arguments ----------------
# df sampled subset
dfsub <- df[sample(nrow(df), nrow(df)*0.5),]
dim(dfsub)
plot(y~x, dfsub)

ARGS <- fit$call # original call information
ARGS$data <- dfsub # substitute dfsub as data
ARGS <- as.list(ARGS) # change class from "call", to "list"

fitsub <- do.call(nls, args = ARGS )
# Error in xj[i] : invalid subscript type 'closure'

Кроме того, в качестве примечания, fit$data просто возвращает имя объекта данных. Действительно ли данные также содержатся в подогнанном объекте nls (как иногда делают подгонки lm и других моделей)?


person Marc in the box    schedule 31.03.2016    source источник
comment
побочный ответ: нет. проверить str(fit). элемент data просто содержит символ для данных (в данном случае df). (В environment(fit$m$fitted) тоже есть кое-что, но не данные.   -  person Ben Bolker    schedule 31.03.2016
comment
@BenBolker - Спасибо за ответ. Приятно знать, что я ничего не упустил.   -  person Marc in the box    schedule 31.03.2016


Ответы (2)


Используйте update, чтобы добавить аргумент подмножества:

nr <- nrow(df)
update(fit, subset = sample(nr, nr * 0.5) )
person G. Grothendieck    schedule 31.03.2016
comment
Гораздо проще, чем то, что я делал! Кажется, это совместимый подход и с другими моделями. - person Marc in the box; 01.04.2016

Вы можете использовать функцию update для переоснащения модели другим набором данных:

fitsub <- update(fit, data = dfsub)
person Wolfgang    schedule 31.03.2016
comment
+1 Тоже спасибо. Я получил два почти идентичных предложения, поэтому мне пришлось присудить правильный ответ тому, который пришел первым. - person Marc in the box; 01.04.2016