【问题标题】:Multiplying column means for groups by column mean for the entire data将组的列平均值乘以整个数据的列平均值
【发布时间】:2021-05-18 00:07:14
【问题描述】:

我正在尝试在 R 中为下面的数据实现以下公式。 nj 是每个 group 的大小,ybarij 是每个 group 上的 y1 和 y2 在我的数据中,y_doublebars 是整体 colMeans(dat[-1]) 的 @9876543343@ 和 @98765 @ 在我的数据中。

手算是(所以答案应该是24.4):

我想知道我错过了什么我无法联系到24.4?

library(tidyverse)

z <- "group    y1    y2
1 1         2     3
2 1         3     4
3 1         5     4
4 1         2     5
5 2         4     8
6 2         5     6
7 2         6     7
8 3         7     6
9 3         8     7
10 3        10     8
11 3         9     5
12 3         7     6"

dat <- read.table(text = z, header = T)

Reduce("+",group_split(dat, group, .keep = FALSE) %>%
              map(~ nrow(.)*(colMeans(.)*colMeans(dat[-1]))))

      y1       y2 
385.3333 396.7500 

【问题讨论】:

    标签: r dataframe dplyr statistics tidyverse


    【解决方案1】:

    您可以使用以下内容:

    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所有组值放在一起。

    【讨论】:

    【解决方案2】:

    这里有两种基本方法:

    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类似地在最后的注释中写出类似的语句。

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

    注意

    关于在 cmets 中涉及 Ws 的公式,我们使用上面的 fm 和 SS 有以下构造。这里的三种方法与上面的三种方法类似:

    SS(resid(fm))
    ##      y1  y2
    ## y1 14.8 1.6
    ## y2  1.6 9.2
    
    SS(dat[-1] - sapply(dat[-1], ave, 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
    

    我们还可以像这样紧凑地重写 cmets 中的公式:

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

    【讨论】:

    • 我们也可以得到平方和(有2个)赌注。该组的意思是使用'var'而不是'cov'然后乘以n-1?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2021-09-06
    • 2019-01-20
    • 2018-07-12
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多