R语言step函数全局寻数问题:向前逐步回归报错排查
解决
step()函数找不到局部数据集的问题 这个报错的根源是step()函数的查找机制:它默认会在全局环境中去寻找模型对应的数据集,而你定义的Data是ForwardStep函数内部的局部变量,全局环境里根本不存在,所以就抛出了object 'Data' not found的错误。当你在全局手动创建Data后,step()能找到它,自然就正常运行了。
下面给你两种可行的修正方案:
方案一:给step()显式传递data参数
直接在调用step()的时候把函数内的局部Data传递给它,明确告诉step()该用哪个数据集,就不会去全局瞎找了。同时推荐用reformulate()构建公式,比字符串拼接更安全易读:
ForwardStep <- function(df,yName, Xs, XsMin) { Data <- df[, c(yName,Xs)] # 用reformulate构建基础公式 base_formula <- reformulate(XsMin, response = yName) fit <- glm(formula = base_formula, data = Data, family = binomial(link = "logit")) # 构建范围公式 ScopeFormula <- list( lower = base_formula, upper = reformulate(Xs, response = yName) ) # 关键:给step()传递data参数 result <- step(fit, direction = "forward", scope = ScopeFormula, trace = 1, data = Data ) return(result) }
方案二:让glm模型保留数据集
在构建glm模型时设置model=TRUE,这样模型对象会把完整的数据集包含进去,step()可以直接从模型内部获取数据,不需要额外传递:
ForwardStep <- function(df,yName, Xs, XsMin) { Data <- df[, c(yName,Xs)] base_formula <- reformulate(XsMin, response = yName) # 设置model=TRUE,让模型保存数据集 fit <- glm(formula = base_formula, data = Data, family = binomial(link = "logit"), model = TRUE) ScopeFormula <- list( lower = base_formula, upper = reformulate(Xs, response = yName) ) result <- step(fit, direction = "forward", scope = ScopeFormula, trace = 1 ) return(result) }
注意:修正调用时的参数名错误
你之前调用函数的时候把yName写成了Yname(大小写不一致),这会导致参数传递错误,修正后的调用代码:
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)
内容的提问来源于stack exchange,提问作者haphap32
相关产品推荐
相关产品推荐

