仅在 dplyr 过程中 glm 后步函数不起作用
Doesn’t work step function after glm only in dplyr procedure
我正在尝试使用 dplyr 运行 逐步回归,但会导致以下错误:
Error in as.data.frame.default(data) : cannot coerce class ‘c("glm", "lm")’ to a data.frame
glm 运行良好,但当代码尝试将步骤的结果保存到数据帧时发生错误。
我检查了函数glm的class和函数步骤与"c(glm, lm)"相同。但只有步进功能不起作用。
我尝试了几种方法来修复这个错误,
像 do 语句、map2(将数据传递给数据参数)但没有任何效果。
更多细节..
当我 运行 此代码时:
...
group_by(ITEM_CODE) %>%
nest() %>%
mutate(model = map(data, ~ glm(formula_full,family=gaussian(),na.action=na.omit,data=.x))
) %>%
ungroup()
结果如下..这里,glm returns c("glm", "lm")
> M_CODE data model
> 0034019 <tibble> <S3: glm>
> 0040726 <tibble> <S3: glm>
> 0057446 <tibble> <S3: glm>
我正在尝试在此(下一个模型列)的第 4 列添加 'step' 结果。
但是当我尝试 运行 下一个代码(添加 stepm 变量)
第二个密码:
group_by(ITEM_CODE) %>%
nest() %>%
mutate(model = map(data, ~ glm(formula_full,family=gaussian(),na.action=na.omit,data=.x))
,stepm = map(model, ~ step(.x, direction = "both", trace = 0)) # <-- Error point!
) %>%
ungroup()
然后出现我一开始提到的错误。
其实,
class(模型) = class(stepm) = c("glm", "lm")
但只有 stepm 不接受并丢弃错误..
所以,我很困惑..
有谁知道这个问题..?
提前谢谢你
我也对这个错误的原因感到困惑,但我从 here 得到了线索,并尝试将 glm
包装在 do.call
中
library(tidyverse)
set.seed(101)
model_df <- tibble(label=c("a", "b", "c"),
model_data = list(tibble(y=rbinom(100,size=1,prob=0.5),
x1=rnorm(100),
x2=rnorm(100),
x3=rnorm(100),
x4=rnorm(100)),
tibble(y=rbinom(100,size=1,prob=0.5),
x1=rnorm(100),
x2=rnorm(100),
x3=rnorm(100),
x4=rnorm(100)),
tibble(y=rbinom(100,size=1,prob=0.5),
x1=rnorm(100),
x2=rnorm(100),
x3=rnorm(100),
x4=rnorm(100))))
model_df <- model_df %>%
mutate(model = map(model_data, ~ do.call("glm", list(y ~ x1 + x2 + x3 + x4,
family = gaussian(),
na.action=na.omit,
data = .x)))) %>%
mutate(stepm = map(model, ~ step(.x, direction = "both", scope=list(lower=.~1, upper=formula(.x)),
trace = 0)))
model_df$stepm[[1]]
#>
#> Call: glm(formula = y ~ 1, family = structure(list(family = "gaussian",
#> link = "identity", linkfun = function (mu)
...
#>
#> Coefficients:
#> (Intercept)
#> 0.54
#>
#> Degrees of Freedom: 99 Total (i.e. Null); 99 Residual
#> Null Deviance: 24.84
#> Residual Deviance: 24.84 AIC: 148.5
今天遇到了这个问题,原因是我给待拟合的模型取了一个已有的dataframe同名,所以这个变量的class混了。解决方法其实很简单,改一下模型的名字,避免命名重叠,就可以了。
我正在尝试使用 dplyr 运行 逐步回归,但会导致以下错误:
Error in as.data.frame.default(data) : cannot coerce class ‘c("glm", "lm")’ to a data.frame
glm 运行良好,但当代码尝试将步骤的结果保存到数据帧时发生错误。
我检查了函数glm的class和函数步骤与"c(glm, lm)"相同。但只有步进功能不起作用。
我尝试了几种方法来修复这个错误, 像 do 语句、map2(将数据传递给数据参数)但没有任何效果。
更多细节.. 当我 运行 此代码时:
...
group_by(ITEM_CODE) %>%
nest() %>%
mutate(model = map(data, ~ glm(formula_full,family=gaussian(),na.action=na.omit,data=.x))
) %>%
ungroup()
结果如下..这里,glm returns c("glm", "lm")
> M_CODE data model
> 0034019 <tibble> <S3: glm>
> 0040726 <tibble> <S3: glm>
> 0057446 <tibble> <S3: glm>
我正在尝试在此(下一个模型列)的第 4 列添加 'step' 结果。
但是当我尝试 运行 下一个代码(添加 stepm 变量)
第二个密码:
group_by(ITEM_CODE) %>%
nest() %>%
mutate(model = map(data, ~ glm(formula_full,family=gaussian(),na.action=na.omit,data=.x))
,stepm = map(model, ~ step(.x, direction = "both", trace = 0)) # <-- Error point!
) %>%
ungroup()
然后出现我一开始提到的错误。
其实, class(模型) = class(stepm) = c("glm", "lm") 但只有 stepm 不接受并丢弃错误..
所以,我很困惑.. 有谁知道这个问题..?
提前谢谢你
我也对这个错误的原因感到困惑,但我从 here 得到了线索,并尝试将 glm
包装在 do.call
library(tidyverse)
set.seed(101)
model_df <- tibble(label=c("a", "b", "c"),
model_data = list(tibble(y=rbinom(100,size=1,prob=0.5),
x1=rnorm(100),
x2=rnorm(100),
x3=rnorm(100),
x4=rnorm(100)),
tibble(y=rbinom(100,size=1,prob=0.5),
x1=rnorm(100),
x2=rnorm(100),
x3=rnorm(100),
x4=rnorm(100)),
tibble(y=rbinom(100,size=1,prob=0.5),
x1=rnorm(100),
x2=rnorm(100),
x3=rnorm(100),
x4=rnorm(100))))
model_df <- model_df %>%
mutate(model = map(model_data, ~ do.call("glm", list(y ~ x1 + x2 + x3 + x4,
family = gaussian(),
na.action=na.omit,
data = .x)))) %>%
mutate(stepm = map(model, ~ step(.x, direction = "both", scope=list(lower=.~1, upper=formula(.x)),
trace = 0)))
model_df$stepm[[1]]
#>
#> Call: glm(formula = y ~ 1, family = structure(list(family = "gaussian",
#> link = "identity", linkfun = function (mu)
...
#>
#> Coefficients:
#> (Intercept)
#> 0.54
#>
#> Degrees of Freedom: 99 Total (i.e. Null); 99 Residual
#> Null Deviance: 24.84
#> Residual Deviance: 24.84 AIC: 148.5
今天遇到了这个问题,原因是我给待拟合的模型取了一个已有的dataframe同名,所以这个变量的class混了。解决方法其实很简单,改一下模型的名字,避免命名重叠,就可以了。