【问题标题】:Explicit formula used in linear regression线性回归中使用的显式公式
【发布时间】:2013-04-02 00:52:49
【问题描述】:

我有一个公式列表,我使用lapplylm 创建一个回归模型列表。但是,当我查看每个线性模型的call 组件时,我看到的不是显式公式,而是我解析成线性模型的变量的名称。例如。使用 mtcars 数据集:

temp_formula_list = list(as.formula(hp~1),as.formula(hp~cyl))
temp_fm_list = lapply(temp_formula_list, function(x) lm(data = mtcars, formula = x))

然后检查calltemp_fm_list[[2]]

temp_fm_list[[2]]$call

给予

lm(formula = x, data = mtcars)

当我希望它明确给出时

lm(formula = hp~cyl, data = mtcars)

【问题讨论】:

  • do.call 在这种情况下非常有用;参见例如stackoverflow.com/a/7668846/210673
  • 谢谢。这看起来几乎是我的问题的重复。我猜我应该在 lapply 中使用 do.call("lm",args = list(formula = x, data=mtcars)) 而不是 lm(data = mtcars, formula = x)
  • 这种工作,除了它还评估mtcars数据,导致一个非常混乱的call组件......
  • do.call("lm",args = list(formula = x, data= quote(mtcars))) 会如你所愿。
  • as.name 也可以工作(而不是quote);这埋在我之前链接到的答案的 cmets 中

标签: r


【解决方案1】:

您可以使用bquote 对语言进行一些简单的计算来构建您的调用。

 temp_fm_list = lapply(temp_formula_list, function(x) {
  lmc <- bquote( lm(data = mtcars, formula = .(x)))
  eval(lmc)                                                      
  })
temp_fm_list
# Call:
#   lm(formula = hp ~ 1, data = mtcars)
# 
# Coefficients:
#   (Intercept)  
# 146.7  
# 
# 
# [[2]]
# 
# Call:
#   lm(formula = hp ~ cyl, data = mtcars)
# 
# Coefficients:
#   (Intercept)          cyl  
# -51.05        31.96  

注意

function(x) do.call('lm', list(formula = x, data = quote(mtcars))

也可以


其他方法....

即使使用原始调用,您也可以从与模型关联的 terms 对象重新创建公式

例如

x <- hp ~ cyl

lmo <- lm(formula = x, data = mtcars)

formula(lmo)
## hp ~ cyl

lmo$call 


# lm(formula = x, data = mtcars)

如果你愿意,你可以弄乱这个 call 对象(尽管这是相当危险的做法)

# for example

lmo$call$formula <- x
lmo$call 
##  lm(formula = hp ~ cyl, data = mtcars)

## however you can create rubbish here too
lmo$call$formula <- 'complete garbage'
lmo$call 
## lm(formula = "complete garbage", data = mtcars)

# but, being careful, you could use it appropriately
temp_fm_list = lapply(temp_formula_list, function(x) {
  oo <- lm(data = mtcars, formula = x)
  oo$call$formula <-x
  oo
})

temp_fm_list
# Call:
#   lm(formula = hp ~ 1, data = mtcars)
# 
# Coefficients:
#   (Intercept)  
# 146.7  
# 
# 
# [[2]]
# 
# Call:
#   lm(formula = hp ~ cyl, data = mtcars)
# 
# Coefficients:
#   (Intercept)          cyl  
# -51.05        31.96  

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2016-02-17
    • 1970-01-01
    • 2016-01-28
    • 2023-03-23
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多