首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在操作/更新拟合模型时访问源数据

如何在操作/更新拟合模型时访问源数据
EN

Stack Overflow用户
提问于 2017-06-27 05:59:50
回答 2查看 45关注 0票数 1

我正在尝试编写一些函数来简化多个模型的改装,但我发现这很痛苦,因为当R深入到评估树中时,它无法找到合适的data。尽管已经努力将公式环境存储在模型中,但我猜真的没有办法明确地指向原始数据对象。这对于使用survfit拟合生存曲线变得更加困难,其中没有terms对象存储在其中。

我真的需要每次都将数据/公式作为参数重新键入吗?

示例:

代码语言:javascript
复制
# model-fitting wrapper function
fn <- function(fn_formula, fn_data) {
    lm(formula = fn_formula, data = fn_data)
}
# specify exemplary data and formula
data <- data.frame(
    y = rnorm(100),
    x1 = rnorm(100),
    x2 = rnorm(100))
formula <- y ~ x1

# try to create and update the fit with different parameters
fn_fit <- fn(formula, data)
update(fn_fit, ~ x2)
# Error in is.data.frame(data) : object 'fn_data' not found
terms(fn_fit) %>% attr('.Environment')
# <environment: R_GlobalEnv>
terms(fn_fit$model) %>% attr('.Environment')
# <environment: R_GlobalEnv>
getCall(fn_fit)
# lm(formula = fn_formula, data = fn_data)
EN

回答 2

Stack Overflow用户

发布于 2017-06-27 06:15:33

对于同名的lm()update(),存储数据的变量应该在相同的作用域中。不确定你真正想要完成的是什么,如果你想要一个函数来创建一个可以在全局环境中使用的签名,你可以这样做

代码语言:javascript
复制
fn <- function(fn_formula, fn_data) {
  do.call("lm", list(fn_formula, data=substitute(fn_data)))
}
fn_fit <- fn(formula, data)
update(fn_fit, ~ x2)

否则,如果您真的想在本地函数作用域中捕获该变量,您可以创建一个帮助器,以便在正确的环境中进行有趣的更新。

代码语言:javascript
复制
fn <- function(fn_formula, fn_data) {
  environment(fn_formula) <- environment()
  lm(formula = fn_formula, data = fn_data)
}

fn_update <- function(object, ...) {
  mc<-match.call(definition = update)
  mc[[1]] <- quote(update)
  eval(mc, envir=environment(terms(object)))
}

fn_fit <- fn(formula, data)
fn_update(fn_fit, ~x2)
票数 3
EN

Stack Overflow用户

发布于 2017-06-27 12:28:29

当您传递公式时,“model”子列表中存储的唯一项是那些需要的项。

代码语言:javascript
复制
> names(fn_fit$model)
[1] "y"  "x1"

但该对象中没有命名为'data‘或'fn_data’的内容。MrFlick第二个建议对框架调用树中的修改更具弹性:

代码语言:javascript
复制
> fn <- function(fn_formula, fn_data) {
+   do.call("lm", list(fn_formula, data=substitute(fn_data)))
+ }
> fn_fit <- fn(formula, data); rm(data)  # mess with the calling environment
> update(fn_fit, ~ x2)
Error in terms.formula(formula, data = data) : 
  'data' argument is of the wrong type

出现这个错误是因为R解释器只找到了名为data的函数;如果您部署了第二个选项,则会得到:

代码语言:javascript
复制
> data <- data.frame(
+     y = rnorm(100),
+     x1 = rnorm(100),
+     x2 = rnorm(100))

> fn <- function(fn_formula, fn_data) {
+   environment(fn_formula) <- environment()
+   lm(formula = fn_formula, data = fn_data)
+ }
> 
> fn_update <- function(object, ...) {
+   mc<-match.call(definition = update)
+   mc[[1]] <- quote(update)
+   eval(mc, envir=environment(terms(object)))
+ }

> 
> fn_fit <- fn(formula, data) ; rm(data)
> fn_update(fn_fit, ~x2)

Call:
lm(formula = y ~ x2, data = fn_data)

Coefficients:
(Intercept)           x2  
    0.01117     -0.13004  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44769299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档