如何解决将组的列均值乘以整个数据的列均值
我正在尝试为下面的数据在 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。