3

在 R 中,您可以使用包含转换的公式从包中拟合 GAM 模型,mgcv例如logorsqrt并且默认情况下model.frame返回 (仅在公式中指定的变量应用了转换)。

有什么办法可以恢复未转换的data.frame

例子:

reg <- mgcv::gam(log(mpg) ~ disp + I(hp^2), data=mtcars)

返回

> head(reg$model,3) log(mpg) disp I(hp^2) Mazda RX4 3.044522 160 12100 Mazda RX4 Wag 3.044522 160 12100 Datsun 710 3.126761 108 8649

但是,我想从模型model.frame

mpg disp hp Mazda RX4 21.0 160 110 Mazda RX4 Wag 21.0 160 110 Datsun 710 22.8 108 93

一些背景newdata大多数模型predict()函数的参数需要未转换的数据,所以我无法将反馈model.frame反馈到predict()函数中。我已经知道省略newdata参数将返回拟合值。我的要求是模型对象将原始数据返回给我。

4

3 回答 3

4

这是一种方法:使用glm代替lm,即使对于高斯数据也是如此。glm返回比 更多的东西lm,包括原始数据框。


好吧,如果你问mgcv问题,你最好提供一个mgcv例子。

mgcv与 有一致的标准glm。请继续阅读以获取可以返回?gamObject的完整列表。如果您通过的参数设置,gam您将看到它可以返回。调用时,添加以下内容datakeepDatacontrolgamgam

control = gam.control(keepData = TRUE)

这是一个简单的、可重现的示例:

dat <- data.frame(x = runif(50), y = rnorm(50))
library(mgcv)
fit <- gam(y ~ s(x, bs = 'cr', k = 5), data = dat, control = gam.control(keepData = TRUE))
head(fit$model)  # model frame
head(fit$data)  # original data
于 2017-03-18T18:48:19.357 回答
3

我们可以vars从“术语”中提取并使用它来子集原始数据集

head(mtcars[all.vars(reg$terms)], 3)
#               mpg disp  hp
#Mazda RX4     21.0  160 110
#Mazda RX4 Wag 21.0  160 110
#Datsun 710    22.8  108  93

或与call

v1 <- all.vars(reg$call)
head(get(tail(v1, 1))[head(v1, -1)], 3)
#               mpg disp  hp
#Mazda RX4     21.0  160 110
#Mazda RX4 Wag 21.0  160 110
#Datsun 710    22.8  108  93
于 2017-03-18T18:48:32.190 回答
1

编辑:基于@李哲源 Zheyuan Li 的评论

以下方法取决于当前工作空间或搜索路径中存在的原始数据。如果我们在更新模型之前删除原始数据,则会产生错误。

Error in is.data.frame(data) : object 'dat' not found

dat <- mtcars
reg <- lm(log(mpg) ~ disp + I(hp^2), data=dat)
head(reg$model,3)
#               log(mpg) disp I(hp^2)
# Mazda RX4     3.044522  160   12100
# Mazda RX4 Wag 3.044522  160   12100
# Datsun 710    3.126761  108    8649

# rm( dat )  ## uncomment this line and see error appears after update
reg <- update(reg, mpg ~ disp + hp, method = 'model.frame' )
head(reg)
#                    mpg disp  hp
# Mazda RX4         21.0  160 110
# Mazda RX4 Wag     21.0  160 110
# Datsun 710        22.8  108  93
# Hornet 4 Drive    21.4  258 110
# Hornet Sportabout 18.7  360 175
# Valiant           18.1  225 105
于 2017-03-18T18:42:58.037 回答