【问题标题】:R Step function looks for data in global environment, not inside defined functionR Step函数在全局环境中查找数据,而不是在定义的函数内部
【发布时间】:2020-03-09 15:36:33
【问题描述】:

我对逐步回归有疑问,我的理解是我没有正确传递参数Data

我有这个功能:

ForwardStep <- function(df,yName, Xs, XsMin) {
    Data <- df[, c(yName,Xs)]
    fit <- glm(formula = paste(yName, " ~ ", paste0(XsMin, collapse = " + ")),
               data = Data, family = binomial(link = "logit") )
    ScopeFormula <- list(lower = paste(yName, " ~ ", paste0(XsMin, collapse = " + ")), 
                         upper = paste(yName, " ~ ", paste0(Xs, collapse = " + ")))
    result <- step(fit, direction = "forward", scope = ScopeFormula, trace = 1 )

    return(result)
}

当我尝试使用以下参数运行它时

df <- data.frame(Y= rep(c(0,1),25),time = rpois(50,2), x1 = rnorm(50, 0,1),
                 x2 = rnorm(50,.5,2), x3 = rnorm(50,0,1))
yName = "Y"
Xs <- c("x1","x2","x3")
XsMin <- 1

res <- ForwardStep(df,Yname,Xs,XsMin)

我收到一个错误: is.data.frame(data) 中的错误:找不到对象“数据”

但是,如果我首先在 Global Env 中定义 Data,它就可以正常工作了。

Data <- df[, c(yName,Xs)]

res <- ForwardStep(df,Yname,Xs,XsMin)

我猜我的功能步骤实现有误,但是我不完全知道如何以正确的方式进行操作。

【问题讨论】:

  • yName / Yname ?

标签: r logistic-regression glm


【解决方案1】:

您需要意识到公式始终具有关联的环境,请参阅help("formula")。永远不要将文本传递给模型函数的 formula 参数,永远不要。如果这样做,您迟早会遇到范围界定问题。通常,我会建议使用语言进行计算,但您也可以从正确范围内的文本创建公式:

ForwardStep <- function(df,Yname, Xs, XsMin) {
  Data <- df[, c(Yname,Xs)]
  f1 <- as.formula(paste(Yname, " ~ ", paste0(XsMin, collapse = " + ")))

  fit <- glm(formula = f1,
             data = Data, family = binomial(link = "logit") )
  f2 <- as.formula(paste(Yname, " ~ ", paste0(XsMin, collapse = " + ")))
  f3 <- as.formula(paste(Yname, " ~ ", paste0(Xs, collapse = " + ")))

  ScopeFormula <- list(lower = f2, 
                       upper = f3)
   step(fit, direction = "forward", scope = ScopeFormula, trace = 1)
}

df <- data.frame(Y= rep(c(0,1),25),time = rpois(50,2), x1 = rnorm(50, 0,1),
                 x2 = rnorm(50,.5,2), x3 = rnorm(50,0,1))
YName = "Y"
Xs <- c("x1","x2","x3")
XsMin <- 1

res <- ForwardStep(df,YName,Xs,XsMin)
#Start:  AIC=71.31
#Y ~ 1
#
#       Df Deviance    AIC
#<none>      69.315 71.315
#+ x1    1   68.661 72.661
#+ x3    1   68.797 72.797
#+ x2    1   69.277 73.277

(公共服务公告:step-wise regression is a garbage generator。有更好的统计技术可用。)

【讨论】:

  • 公共服务公告:逐步回归是一个垃圾生成器。有更好的统计技术可用。 - 你愿意分享吗? ;)
  • @dario 最佳技术取决于您的用例。您可以使用正则化回归方法(LASSO、弹性网络)或机器学习方法。
  • 感谢您的评论@Roland。我在考虑套索,但你似乎有这么清楚的意见,我不得不问;)!
  • @Roland,你能添加(或链接到)一个基于语言的计算示例吗?
  • @eipi:这正是我能最快找到的:stackoverflow.com/a/59987272/1412059
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2022-01-04
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多