无法让 aggregate() 按组进行回归

Can't get aggregate() work for regression by group

我想将 aggregate 与此自定义函数一起使用:

#linear regression f-n
CalculateLinRegrDiff = function (sample){
  fit <- lm(value~ date, data = sample)
  diff(range(fit$fitted))
}

dataset2 = aggregate(value ~ id + col, dataset, CalculateLinRegrDiff(dataset))

我收到错误:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'FUN' of mode 'function' was not found

怎么了?

你使用 aggregate 的语法首先是错误的。将函数 CalculateLinRegrDiff 不是评估的函数 CalculateLinRegrDiff(dataset) 传递给 FUN 参数。

其次,您选择了错误的工具。 aggregate 无法帮助您按组拟合回归。它根据RHS上的组合在LHS上拆分~的向量,然后在LHS上应用FUN。也就是说,FUN 应该是一个使用原子向量而不是数据框的函数。比如,meansdquantile等都是以原子向量为输入的函数。 CalculateLinRegrDiff 需要一个数据框输入,但不适用于 aggregate

请注意,有时我们在 LHS 上使用 cbind,例如 cbind(x, y) ~ f。这意味着我们将 FUNx ~ fy ~ f 并行应用。 LHS 变量是独立的,不一起使用。

适合您的工具是 by 函数。它将数据帧拆分为子数据帧,并在每个子帧上应用 FUN。所以很适合分组回归。

by(dataset[c("value", "date")], dataset[c("id", "col")], CalculateLinRegrDiff)

一个简单的可重现示例:

set.seed(0)
dataset <- data.frame(value = runif(20), date = runif(20),
                      f = sample(gl(2, 10)), g = sample(gl(4, 5)))
oo <- by(dataset[c("value", "date")], dataset[c("f", "g")], CalculateLinRegrDiff)
str(oo)
# by [1:2, 1:4] 0.307 0.251 0.109 0.201 0.472 ...
# - attr(*, "dimnames")=List of 2
#  ..$ f: chr [1:2] "1" "2"
#  ..$ g: chr [1:4] "1" "2" "3" "4"

由于 CalculateLinRegrDiff 是一个标量函数,returns 是单个标量,by 会将结果 oo 简化为数组而不是列表。这个数组就像一个偶数table,所以我们可以使用as.data.frame的"table"方法将它reshape成一个data frame:

oo <- as.data.frame.table(oo)
#  f g      Freq
#1 1 1 0.3069877
#2 2 1 0.2508591
#3 1 2 0.1087895
#4 2 2 0.2007295
#5 1 3 0.4715680
#6 2 3 0.4942069
#7 1 4 0.3223174
#8 2 4 0.4687340

名称 "Freq" 可能不是您想要的,但您可以轻松更改它。说 names(oo)[3] <- "foo".

正如我在你的问题下的评论中所说,我们也可以使用 splitlapply。但是没有简单的方法可以将结果转换为好看的数据框。

datlist <- split(dataset[c("value", "date")], dataset[c("f", "g")], drop = TRUE)
rr <- lapply(datlist, CalculateLinRegrDiff)
stack(rr)
#     values ind
#1 0.3069877 1.1
#2 0.2508591 2.1
#3 0.1087895 1.2
#4 0.2007295 2.2
#5 0.4715680 1.3
#6 0.4942069 2.3
#7 0.3223174 1.4
#8 0.4687340 2.4

我建议您阅读 Linear Regression and group by in R 以全面了解分组回归的演示。