Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R从model.frame恢复原始data.frame_R_Regression_Linear Regression_Lm_Mgcv - Fatal编程技术网

R从model.frame恢复原始data.frame

R从model.frame恢复原始data.frame,r,regression,linear-regression,lm,mgcv,R,Regression,Linear Regression,Lm,Mgcv,在R中,您可以使用包含变换(如log或sqrt)的公式拟合mgcv包中的GAM模型,默认情况下返回model.frame(仅在应用了变换的公式中指定的变量) 有什么方法可以恢复未转换的数据.frame 示例: reg head(reg$型号,3) 日志(mpg)显示I(hp^2) 马自达RX4 3.044522 160 12100 马自达RX4 Wag 3.044522 160 12100 Datsun 710 3.126761 108 8649 但是,我想从模型的model.frame m

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

有什么方法可以恢复未转换的
数据.frame

示例:

reg head(reg$型号,3)
日志(mpg)显示I(hp^2)
马自达RX4 3.044522 160 12100
马自达RX4 Wag 3.044522 160 12100
Datsun 710 3.126761 108 8649

但是,我想从模型的
model.frame


mpg显示hp
马自达RX4 21.0 160 110
马自达RX4 Wag 21.0 160 110
Datsun 710 22.8 108 93


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

编辑:基于@李哲源 李哲远

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

is.data.frame(数据)中出错:未找到对象“dat”


dat这里有一种方法:使用
glm
而不是
lm
,即使对于高斯数据也是如此
glm
返回的内容比
lm
多得多,包括原始数据帧


那么,如果您要问
mgcv
问题,最好提供一个
mgcv
示例

mgcv
glm
具有一致的标准。阅读
?gamObject
,了解
gam
可以返回的内容的完整列表。如果通过
gam
control
参数设置
keepData
,您将看到它可以返回
数据。调用
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

dat我们可以从“术语”中提取
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

或使用
呼叫

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

v1是否有一种简单的方法以编程方式反转每个转换?我不想编写自定义代码来解析列名,然后应用某些函数。转换不一定是可逆的。在您的示例中,您使用了
hp^2
,这是不可逆的,因为它失去了
hp
的符号。
mgcv
中使用的平滑变换肯定是不可逆的——它们使得将两个不同的输入值映射到同一输出成为可能。唯一可行的方法就是保存数据,如哲远的回答。你有没有找到解决这个问题的方法?我可以自己使用这个问题的解决方案这实际上是针对
gam
,它也不提供此信息它是
mgcv
模型,不是
gam
gam
包实际上会将数据作为模型对象的一部分返回。您可以将
keep.data
参数提供给
mgcv::gam()
,但它仍然不会返回原始数据。它仍然只返回
model.frame
。您可以在我的帖子中看到,我的要求是model对象返回原始数据。您不能假设数据集已加载或甚至存在于全局环境中。@StevenMortimer我仅从模型中提取术语。否则,您必须基于模型对象进行转换,因为原始数据集不存在。我理解术语来自示例中的模型对象,但我需要来自模型对象的原始、未转换的数据。我从
model.frame
中假设,因为这是唯一与原始数据相似的东西。@StevenMortimer如果没有原始对象,则模型对象没有原始数据集(根据示例中显示的模型)。如果原始对象可用,则第二个选项(更新)有效too@StevenMortimer如果在同一环境中工作,可能
eval(getCall(reg)$data,environment(formula(reg)))[all.vars(reg$terms)]
。否则,如果模型对象没有任何信息来获取原始数据,则可能并不容易。此答案无法解决问题。问题表明,您可以从对象中检索
model.frame
,但无法轻松地检索未转换的数据。
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