【问题标题】:How to get regression output in R ignoring one factor level in data?如何在 R 中忽略数据中的一个因素水平获得回归输出?
【发布时间】:2018-09-26 16:43:37
【问题描述】:

我正在使用因子变量对嵌套数据进行回归。如果一个分组数据具有一个因子水平,则回归失败并抛出错误“对比只能应用于具有 2 个或更多水平的因子”。例如:

data <- mtcars %>% mutate(am = if_else(carb==1, 1,am),
                          am=as.factor(am))

data_carb <- data %>%
  group_by(carb) %>% 
  nest()

X <- c("cyl", "disp", "hp" , "drat", "wt", "qsec", "vs", "am", "gear")
Y <- "mpg"

generic_model <- function(df) {
  lm(reformulate(X, Y), data = df)
}

modelondata <-  data_carb %>% 
  mutate(model = data %>% map(generic_model),
         coeff  = model %>% map(broom::tidy)) %>% 
  unnest(coeff, .drop = TRUE)

如何将变量保留为因子并获得至少那些因子水平大于 1 的分组数据的输出,即 carb!=1?

在我的真实数据中,我有许多具有数十个水平的因子变量,即使其中一个分组数据具有恒定的因子水平,回归也会失败。因此,我不想删除变量,因为我也会失去对其他分组数据的洞察力。

【问题讨论】:

  • tryCatch(lm(...)) ?
  • 你能告诉我如何在代码中做到这一点吗?
  • tryCatch(lm(reformulate(X, Y), data = df), error = function(e) NULL) 其他一切都一样.. 或 function(e) NA 如果您想保持分组级别
  • @rawr:成功了。谢谢!

标签: r dplyr lm purrr


【解决方案1】:

如果您创建了一个函数来删除具有“固定”因子的列会怎样

drop_fixed_factors <- function(x) {
  x %>% keep(~!is.factor(.x) | length(unique(.x))>2)
}

然后做了这样的事情

generic_model <- function(df) {
  good_data <- df[X] %>% drop_fixed_factors()
  lm(reformulate(names(good_data), Y), data = df)
}

那么您可以只保留具有可变性的列。

【讨论】:

  • 我可以这样做,但我想,我会丢失分组/嵌套数据中具有可变性的那部分的系数。
  • 好吧,您只是将它应用于分组数据,因此您将获得每个组的不同子集。 modelondata %&gt;% group_by(carb) %&gt;% count()
  • 我的实际数据出现了同样的错误。 !is.factor(.x) 不是删除所有因子变量吗?
  • 另外,NA 不会在因子变量中产生一个额外的级别吗?我该如何处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多