微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将组的列均值乘以整个数据的列均值

我正在尝试为下面的数据在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。