【问题标题】:Turn comma separated vector into list of predictors separated by + [duplicate]将逗号分隔的向量转换为由 + 分隔的预测变量列表 [重复]
【发布时间】:2021-12-27 10:32:33
【问题描述】:

我想将我手动创建的逗号分隔向量直接传递给 glm 模型。该模型需要用加号 + 分隔预测变量,所以我想知道在将向量传递给模型时,是否有一种聪明的方法可以将 ,s 替换为 +s?

例如,假设我有这两个向量:

fruits <- c('apples', 'bananas', 'pears', 'apricots')
colors <- c('blue', 'red', 'orange', 'purple')

目前,我只是复制预测变量并手动添加+ 符号。例如

glm(dependent_var ~ apples + bananas + pears + apricots + blue + red + orange + purple, data = df, family = "binomial")

我想做的是找到一种减少手动操作的方法。例如。有没有一种方法我可以基本上只复制矢量名称本身?类似的东西

glm(dependent_var ~ fruits + colors, data = df, family = "binomial")

【问题讨论】:

  • 我认为这个问题中的第二个(不被接受的)答案实际上与下面的德申相似——它也包括公式调用中的因变量——排除它会很好。对我而言,最好的答案是 G. Grothendieck 建议使用 reformulate,虽然包含在该问题的答案之一中,但该问题的答案被埋没了
  • 足够公平,但我认为保持开放是有价值的 ^^ Godrim 分享的问题是专门关于将 df 中的所有变量作为模型中的预测变量。这是我提出的更一般性问题的一个特例——可以说这对学习 R 的人具有更大的价值

标签: r string


【解决方案1】:

1) 使用重新表述:

fo <- reformulate(c(fruits, colors), "dep_var"); fo
## dep_var ~ apples + bananas + pears + apricots + blue + red + 
##     orange + purple

glm(fo, data = df, family = "binomial")   

请注意,如果您将变量 fo 传递给 glm,则输出的 Call: 行将按字面意思显示 fo

fo <- reformulate("Time", "demand")
glm(fo, data = BOD)
## 
## Call:  glm(formula = fo, data = BOD)
## ...

要让它显示fo 的内容而不是BOD 的内容,请使用do.callquote,如下所示:

do.call("glm", list(fo, data = quote(BOD)))
##
## Call:  glm(formula = demand ~ Time, data = BOD)

或者将 fo 分配回“glm”对象:

fm <- glm(fo, data = BOD)
fm$call[[2]] <- fo
fm
##
## Call:  glm(formula = demand ~ Time, data = BOD)

2) 另一种可能是:

glm(dep_var ~., data = df[c("dep_var", fruits, colors)], family = "binomial")

如果 "dep_var"、fruits 和 colors 是 df 中唯一的列,那么可以缩短为:

glm(dep_var ~., data = df, family = "binomial")

【讨论】:

    【解决方案2】:

    您可以将模型输入粘贴在一起并将其转换为公式对象。

    这是一个例子:

    head(mtcars)
                       mpg cyl disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    
    x1 <- c("cyl", "disp")
    x2 <- c("drat", "wt")
    y <- "mpg"
    
    my_formula <- as.formula(paste0(y, "~", paste0(c(x1, x2), collapse = "+")))
    
    # "my_formula" gives:
    # mpg ~ cyl + disp + drat + wt
    
    lm(my_formula, data = mtcars)
    
    Call:
    lm(formula = my_formula, data = mtcars)
    
    Coefficients:
    (Intercept)          cyl         disp         drat           wt  
      41.160271    -1.786074     0.007472    -0.010492    -3.638075  
    

    【讨论】:

    • 这看起来很棒。谢谢。 my_formula 是否也需要包含因变量?理想情况下,我仍然希望自己手动将其添加到模型中
    • 我想是的,是的。但这对您没有什么影响,因为无论如何您都需要提供 DV,无论是直接在模型调用中还是在公式创建中。并且公式创建将为您提供更大的灵活性。因此,您可以在一个地方定义 IV 和 DV,创建公式并将其粘贴到模型调用中。
    • 是的。我的想法是,如果每次运行模型时都拼写出 DV,那么代码对于技术含量较低的受众来说会更易读
    【解决方案3】:

    如果您将对glm 的调用与paste0 结合起来,它可能会起作用:

    数据:

    fruits <- c('apples', 'bananas', 'pears', 'apricots')
    colors <- c('blue', 'red', 'orange', 'purple')
    

    第 1 步:折叠 fruitscolors 将元素与 + 连接起来:

    fruits.1 <- paste0(fruits, collapse = " + ")
    colors.1 <- paste0(colors, collapse = " + ")
    

    第 2 步:使用 paste0fruits.1colors.1 输入到 glm

    glm(paste0("dependent_var ~ ",fruits.1, " + ", colors.1), data = df, family = "binomial")
    

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2018-05-27
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2014-08-24
      • 1970-01-01
      相关资源
      最近更新 更多