问题描述
我正在尝试为下面的数据在 R 中实现以下公式。 nj
是每个 group
的大小,ybarij
是每个 group
表示在我的数据中的 y1
和 y2
,以及 {{1} }s 是我数据中 y_doublebar
和 colMeans(dat[-1])
的总体 y1
。
我想知道我错过了什么无法到达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
,计算 y1
和 y2
的列均值,并用 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