【问题标题】:Generate a regression formula from columns从列生成回归公式
【发布时间】:2020-11-26 17:16:19
【问题描述】:

我正在尝试使用负二项式回归生成一个用于自动分析变量及其相互作用的模型。我已经取得了一些进展(主要归功于 SO :-),现在我想生成回归字符串以传递给 neg bin 模型和 stepaic 函数。

有什么想法吗?

这是我的代码

library(dplyr)
library(purrr)
library(stringr)
df<- nycflights13::weather
interactions <- c("hour","dewp","humid","wind_dir","wind_speed")
target_col<- "temp"
out <- combn(interactions, 2, function(x) df %>%
               dplyr::select(x) %>%
               transmute(!! str_c(x, collapse="_"):= reduce(., `*`)),
             simplify = FALSE) %>% 
  bind_cols %>% 
  bind_cols(df, .)

target_formula<- target_col ~ interactions + combinations
model <- glm.nb(target_formula, data=df)
model<- stepaic(model)

【问题讨论】:

  • 你的目标是写一个公式? combinations 是什么?它是如何产生的?另外,您缺少library(MASS) 或至少MASS::gml.nb
  • 我昨天回答了一个类似的问题stackoverflow.com/a/64104445/6574038
  • 你为什么不这样做:target_formula &lt;- as.formula(sprintf("%s ~ (%s)^2", target_col, paste(interactions, collapse = " + ")))

标签: r glm


【解决方案1】:

我看到您有 5 个变量要在公式中使用。而且您还希望包含交互。

那你为什么不试试这个方法:

df <- nycflights13::weather
interactions <- c("hour","dewp","humid","wind_dir","wind_speed")
target_col <- "temp"
target_formula <- as.formula(sprintf("%s ~ (%s)^2", 
                             target_col, 
                             paste(interactions, collapse = " + ")))
model <- MASS::glm.nb(target_formula, data = df)
model <- MASS::stepAIC(model)

编辑

如果您只想计算某些变量的交互作用,您可以执行以下操作:

df<- nycflights13::weather
vars <- c("hour","dewp","humid","wind_dir","wind_speed", 
          "wind_dir:wind_speed", "dewp:humid")
target_col <- "temp"
target_formula <- as.formula(sprintf("%s ~ %s", 
                                     target_col, 
                                     paste(vars, collapse = " + ")))
model <- MASS::glm.nb(target_formula, data = df)
model <- MASS::stepAIC(model)

只需以var1:var2 之类的格式将它们添加到vars


编辑 2

如果您需要所有只是一些变量之间的交互,您可以按照以下方式进行:

df<- nycflights13::weather
singles <- c("hour","dewp")
interactions <- c("humid","wind_dir","wind_speed")
target_col <- "temp"

target_formula <- as.formula(sprintf("%s ~  %s + (%s)^2", 
                                     target_col, 
                                     paste(singles, collapse = " + "),
                                     paste(interactions, collapse = " + ")))
model <- MASS::glm.nb(target_formula, data = df)
model <- MASS::stepAIC(model)

问题是你会得到所有的交互:例如,如果你不想要humid:wind_dir,这个解决方案不是你想要的。

如果你只想要特定的交互,你需要使用之前的编辑。

如果你想使用除了一些之外的大部分交互,还有其他的方式,但是如果你有特定的规则,我们可以想出一些高效的方式。

例如,像这样的:

setdiff(combn(c("humid","wind_dir","wind_speed"), 2, paste, collapse = ":"), "humid:wind_dir")
#> [1] "humid:wind_speed"    "wind_dir:wind_speed"

【讨论】:

  • 您好,效果很好。现在我想使用这 5 个变量,但只在交互中包含其中一些变量。我该怎么做?
  • 谢谢!有没有办法从两个列表中自动生成它?我有很多很多变量
  • 这取决于..您可以将变量拆分为两个向量..一个向量可以单独添加变量,另一个可以在所有变量之间进行交互。问题是,如果您不需要第二个向量中的变量之间的所有交互,那么您将再次遇到问题……您是否有某种规则来定义交互?
  • 我相信这是一个简单的笛卡尔连接,我们应该计算 vector1 、 vector2 和 vector1*vecror2 (但不是 vector2*vector2 等)
  • 谢谢!也很出色。您知道是否有任何方法可以让 STEPAIC 只考虑重要的交互?学院对模型的看法与行业有点不同,导致这样的需求
【解决方案2】:

使用reformulate 创建没有交互的公式,然后使用update 它包含交互:

rhs_vars <- c("hour","dewp","humid","wind_dir","wind_speed")
target <- "temp"

update(reformulate(rhs_vars, target), . ~ (.)^2)

给出这个公式对象:

temp ~ hour + dewp + humid + wind_dir + wind_speed + hour:dewp + 
    hour:humid + hour:wind_dir + hour:wind_speed + dewp:humid + 
    dewp:wind_dir + dewp:wind_speed + humid:wind_dir + humid:wind_speed + 
    wind_dir:wind_speed

【讨论】:

  • 这看起来不错。现在我要做的就是从这个字符串中提取列作为列列表。 count_new ~ sno + spring_dummy+ cos365.4
  • 不是字符串。这是一个公式。如果我们称它为fo,那么all.vars(fo) 是公式中变量的字符向量,即它与c(target, rhs_vars) 相同,labels(terms(fo)) 是公式中右侧15 个项的字符向量。
  • 谢谢。看起来没问题,但也许我有一个问题。我附上我的例子 - fo&lt;-nested$formula[[1]] print(fo) print((all.vars(fo))) &gt; print(fo) [1] "count_new ~ sno + winter_dummy + spring_dummy+ autumn_dummy " &gt; print((all.vars(fo))) character(0)
  • 您需要用分号分隔 R 命令以使其清晰易读。
猜你喜欢
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多