我想让dplyr::summarise_each
使用lm
的公式界面。在这个简单的例子中,我基于一个二级和三级因子变量(group2和group3)从一系列变量(x,y,z)中获得效果大小估计。
set.seed(77)
example <- data.frame(group2 = factor(sample(1:2, 500, TRUE)),
group3 = factor(sample(1:3, 500, TRUE)),
x = sample(1:100, 500, TRUE),
y = sample(1:100, 500, TRUE),
z = sample(1:100, 500, TRUE))
对于group2,我可以使用effsize:::cohen.d
来获取每个变量的估算值:
library(dplyr)
library(effsize)
cooksD <- summarise_each(example[3:5],
funs(cohen.d(., f = example$group2, na.rm = TRUE)$estimate))
# cooksD
# x y z
# 1 -0.08 -0.13 -0.01
但是,要获得3级对象的r平方,我需要使用summary(lm())$r.squared
,这不起作用:
rsq <- summarise_each(example[3:5], funs(summary(lm(. ~ group3, data = example))$r.squared))
# Error in terms.formula(formula, data = data) :
# invalid term in model formula
我知道这是因为我使用了&#34;。&#34;在lm()
电话中,但我不确定如何将数据向量传递给lm()
。我已查看过do()
,但到目前为止还没有成功实施。{1}}
答案 0 :(得分:2)
问题似乎是dplyr如何替换函数中的变量。而不是看起来像
lm(y~group3, example)
你会得到像
这样的东西lm(c(99L, 74L, 31L, 82L, ...) ~group3, example)
(如果列表足够长),在尝试找出参数名称时抛出错误。另一种方法可能是
summarise_each(example[3:5],
funs(summary(lm(RESP ~ group3, data = cbind(example, RESP=.)))$r.squared))
这里我们将响应列绑定到data.frame,这不是那么有效。在这种情况下,我可能会避免使用summarize_each
,而是希望迭代的符号更加标准lapply
。
lapply(names(example)[3:5], function(r) {
eval(substitute(summary(lm(r ~ group3, data = example))$r.squared, list(r=as.name(r))))
})