在R中调用boxcox函数时出现closure类型对象子集化错误
问题描述
我编写了一段简单的R代码:
library(MASS) library(tidyverse) df <- read_csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/insurance.csv") b <- boxcox(lm(df$charges ~ 1))
运行时出现如下错误:
Error in df$charges : 类型为'closure'的对象不可子集化
单独调用lm(df$charges ~ 1)能正常运行,还可以用summary查看结果,但将其传入boxcox函数以选择lambda时却触发了该错误。
错误原因
问题出在lm的调用方式:当你直接用df$charges ~ 1作为公式时,lm只是把df$charges当成独立向量传入,没有将df关联为模型的数据源。而MASS::boxcox处理线性模型时,会重新解析公式并获取数据,此时它会在自身执行环境中查找df,但这个df被识别为base包中的df()密度函数(属于closure类型),而非你定义的数据框,因此触发错误。
解决方法
修改lm的调用方式,通过data参数指定数据源,让公式直接引用数据框的列名,这样boxcox就能正确识别数据:
library(MASS) library(tidyverse) df <- read_csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/insurance.csv") # 指定data参数,公式使用列名而非直接引用向量 model <- lm(charges ~ 1, data = df) b <- boxcox(model)
也可以直接在一行内完成:
b <- boxcox(lm(charges ~ 1, data = df))
这样修改后,lm会把df作为模型的数据源记录下来,boxcox处理时就能正确找到数据框df,不会和base包的df()函数混淆,从而正常执行lambda选择操作。
内容的提问来源于stack exchange,提问作者Norhther
相关产品推荐
相关产品推荐

