R 从 model.frame 恢复原来的 data.frame
R Recover original data.frame from model.frame
在 R 中,您可以使用包含 log
或 sqrt
等转换的公式拟合 mgcv
包中的 GAM 模型,默认情况下 model.frame
是returned(仅在公式中指定的变量应用了转换)。
有什么方法可以恢复未转换的 data.frame
?
示例:
reg <- mgcv::gam(log(mpg) ~ disp + I(hp^2), data=mtcars)
returns
> 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
一些背景知识:大多数模型的 predict()
函数的 newdata
参数需要未转换的数据,因此我无法将 model.frame
反馈回predict()
函数。我已经知道省略 newdata
参数将 return 拟合值。我的要求是模型对象给我返回原始数据。
编辑: 根据@李哲源 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
这是一种方法:使用 glm
而不是 lm
,即使对于高斯数据也是如此。 glm
return 比 lm
多了很多东西,包括原始数据框。
嗯,如果你问 mgcv
问题,你最好提供一个 mgcv
例子。
mgcv
与glm
有一致的标准。阅读 ?gamObject
以获得 gam
可以 return 的完整列表。如果您通过 gam
的 control
参数设置 keepData
,您将看到它可以 return data
。调用gam
时,添加如下
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
我们可以从 'terms' 中提取 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
在 R 中,您可以使用包含 log
或 sqrt
等转换的公式拟合 mgcv
包中的 GAM 模型,默认情况下 model.frame
是returned(仅在公式中指定的变量应用了转换)。
有什么方法可以恢复未转换的 data.frame
?
示例:
reg <- mgcv::gam(log(mpg) ~ disp + I(hp^2), data=mtcars)
returns
> 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
一些背景知识:大多数模型的 predict()
函数的 newdata
参数需要未转换的数据,因此我无法将 model.frame
反馈回predict()
函数。我已经知道省略 newdata
参数将 return 拟合值。我的要求是模型对象给我返回原始数据。
编辑: 根据@李哲源 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
这是一种方法:使用 glm
而不是 lm
,即使对于高斯数据也是如此。 glm
return 比 lm
多了很多东西,包括原始数据框。
嗯,如果你问 mgcv
问题,你最好提供一个 mgcv
例子。
mgcv
与glm
有一致的标准。阅读 ?gamObject
以获得 gam
可以 return 的完整列表。如果您通过 gam
的 control
参数设置 keepData
,您将看到它可以 return data
。调用gam
时,添加如下
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
我们可以从 'terms' 中提取 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