【问题标题】:Doesn’t work step function after glm only in dplyr procedure仅在 dplyr 程序中 glm 后不工作 step 功能
【发布时间】:2020-03-09 23:40:35
【问题描述】:

我正在尝试使用 dplyr 运行逐步回归,但会导致以下错误:

Error in as.data.frame.default(data) : cannot coerce class ‘c("glm", "lm")’ to a data.frame

glm 运行良好,但是当代码尝试将步骤的结果保存到数据帧时,会发生错误。

我检查了函数 glm 的类和函数 step 是否与“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返回c(“glm”,“lm”)

> M_CODE     data       model 
> 0034019   <tibble>    <S3: glm>       
> 0040726   <tibble>    <S3: glm>           
> 0057446   <tibble>    <S3: glm>

我正在尝试在此(下一个模型列)的第 4 列添加“步骤”结果。

但是当我尝试运行下一个代码时(添加 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()

然后发生我一开始提到的错误。

其实, 类(模型)= 类(stepm)= c(“glm”,“lm”) 但只有 stepm 不接受并丢弃错误..

所以,我很困惑.. 有谁知道这个问题..?

提前谢谢你

【问题讨论】:

  • 错误消息似乎相当有用。您没有足够详细地描述这项工作的目标以提供替代方案。而且你也没有 MCVE。如果您希望进一步努力,请解决这两个缺陷。
  • 我将提供进一步的建议,即大多数 R 专家认为“逐步”方法是错误的。在 SAS 或 SPSS 中执行这种统计不当行为的难易程度被认为是它们的主要失败之一......以及成本过高和方法缺乏透明度。
  • 请使用dput 添加数据并显示相同的预期输出。请阅读有关how to ask a good question 的信息以及如何提供reproducible example
  • 哦,谢谢你的建议。我再次写了更详细的内容:)

标签: r dplyr glm


【解决方案1】:

今天遇到这个问题,原因是我给待拟合的模型取了一个已有dataframe的名字,所以这个变量的class是混的。解决方法其实很简单,只要改一下模型的名字,避免命名重叠就行了。

【讨论】:

    【解决方案2】:

    我也对这个错误的原因感到困惑,但我从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
    

    【讨论】:

    • 我不知道为什么我的回复被删除了,但非常感谢你的回答。它工作得很好!再次感谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多