将组的列均值乘以整个数据的列均值

问题描述

我正在尝试为下面的数据在 R 中实现以下公式。 nj 是每个 group 的大小,ybarij 是每个 group 表示在我的数据中的 y1y2,以及 {{1} }s 是我数据中 y_doublebarcolMeans(dat[-1]) 的总体 y1

enter image description here

手工计算将是(所以答案应该是y2):

enter image description here

我想知道我错过了什么无法到达24.4

24.4

解决方法

您可以使用以下内容:

library(dplyr)
tmp <- colMeans(dat[-1])

dat %>%
  group_by(group) %>%
  summarise(result = n() * prod(colMeans(cur_data()) - tmp)) %>%
  summarise(result = sum(result))

#  result
#   <dbl>
#1   24.4

计算整个数据的列均值并将其存储在 tmp 中,因此我们不会重新计算它。对于每个 group,计算 y1y2 的列均值,并用 tmp 减去它。将结果与组中的行数相乘。最后,我们sum 将所有组值放在一起。

,

这里有两种基本方法:

1) lm 定义一个居中的平方和函数 SS 并将其应用于指定回归的拟合值。回归公式中的 +0 是可选的。

SS <- function(x,y = x) (NROW(x) - 1) * cov(x,y)

fm <- lm(cbind(y1,y2) ~ factor(group) + 0,dat)
SS(fitted(fm))[1,2]
## [1] 24.4

2) ave 将 y1 的每个元素替换为其组的平均值,对 y2 执行相同操作并应用 SS。

SS(sapply(dat[-1],ave,dat[1]))[1,2]
## [1] 24.4

3) collapse 这个包有 fbetween 和 fwithin,可以简写为 B 和 W 允许 (2) 写成如下。这去掉了 (2) 中的 sapply 并且使用 W 我们可以类似地在最后的 Note 中编写类似的语句。

library(collapse)
SS(B(dat[-1],dat[[1]]))[1,2]
## [1] 24.4

注意

关于在评论中涉及 Ws 的公式,我们使用上面的 fm 和 SS 构建了以下结构。这里的三种方法类似于上面的三种:

SS(resid(fm))
##      y1  y2
## y1 14.8 1.6
## y2  1.6 9.2

SS(dat[-1] - sapply(dat[-1],dat[[1]]))
##      y1  y2
## y1 14.8 1.6
## y2  1.6 9.2

library(collapse)
SS(W(dat[-1],dat[[1]]))
##      W.y1 W.y2
## W.y1 14.8  1.6
## W.y2  1.6  9.2

我们也可以像这样简洁地重写注释中的公式:

Reduce("+",by(dat[-1],dat[[1]],SS))
##      y1  y2
## y1 14.8 1.6
## y2  1.6 9.2