无法让 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
应该是一个使用原子向量而不是数据框的函数。比如,mean
、sd
、quantile
等都是以原子向量为输入的函数。 CalculateLinRegrDiff
需要一个数据框输入,但不适用于 aggregate
。
请注意,有时我们在 LHS 上使用 cbind
,例如 cbind(x, y) ~ f
。这意味着我们将 FUN
与 x ~ f
和 y ~ 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"
.
正如我在你的问题下的评论中所说,我们也可以使用 split
和 lapply
。但是没有简单的方法可以将结果转换为好看的数据框。
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 以全面了解分组回归的演示。
我想将 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
应该是一个使用原子向量而不是数据框的函数。比如,mean
、sd
、quantile
等都是以原子向量为输入的函数。 CalculateLinRegrDiff
需要一个数据框输入,但不适用于 aggregate
。
请注意,有时我们在 LHS 上使用 cbind
,例如 cbind(x, y) ~ f
。这意味着我们将 FUN
与 x ~ f
和 y ~ 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"
.
正如我在你的问题下的评论中所说,我们也可以使用 split
和 lapply
。但是没有简单的方法可以将结果转换为好看的数据框。
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 以全面了解分组回归的演示。