3

我有一个数据框,我想在其中计算按三列中的因子分组的观察值的标准误差。使用 tapply 计算组平均值的标准偏差和标准误差:

aveResponse <- tapply(df$Response, col1:col2:col3, mean, na.rm=T)

aveSD <- tapply(df$Response, col1:col2:col3, sd, na.rm=T)

stderr <- function(x) sqrt(var(x,na.rm=TRUE)/(length(na.omit(x)))
aveSEM <- tapply(df$Response, col1:col2:col3, stderr, na.rm=T)

我之前已经计算了单个观察值的标准偏差(保存在 colSD 列中),并想计算相应的标准误差。使用下面的函数,我可以获得标准错误:

stderr <- function(x) x/sqrt(length(na.omit(x)))
SEM<- tapply(df$colSD, col1:col2:col3, stderr)

但是,结果以数组的形式给出,每组的 n 个观察值作为每个位置的字符串(我认为)。任何想法如何通过更改函数,使用另一个函数或将数组转换为每个观察值的标准误差都有自己位置的向量来进一步移动?

一个小样本(如果我通过 dput(df),你会更容易使用吗?):

>df
    col1    col2  col3 Response colSD
1  food1 tissue1 gene1    1.644 0.080
2  food1 tissue1 gene1    1.726 0.093
3  food1 tissue2 gene1    0.088 0.014
4  food1 tissue2 gene1    0.002 0.000
5  food2 tissue1 gene1    0.311 0.012
6  food2 tissue1 gene1    0.657 0.265
7  food2 tissue2 gene1    0.000 0.000
8  food2 tissue2 gene1    0.001 0.000
9  food1 tissue1 gene2    3.223 0.246
10 food1 tissue1 gene2    2.156 0.440
11 food1 tissue2 gene2    0.279 0.200
12 food1 tissue2 gene2    0.033 0.007
13 food2 tissue1 gene2    0.044 0.002
14 food2 tissue1 gene2    0.265 0.117
15 food2 tissue2 gene2    0.000 0.000
16 food2 tissue2 gene2    0.000 0.000

我想计算每个观察值的标准误差,例如 等0.080/sqrt(2)0.093/sqrt(2)并将结果作为附加列添加到数据框中:

>df
    col1    col2  col3 Response colSD colSEM
1  food1 tissue1 gene1    1.644 0.080  0.057
2  food1 tissue1 gene1    1.726 0.093  0.066 etc...
4

1 回答 1

2

您可以使用以下方法获得非常紧凑的解决方案ddply

library(plyr)
df <- ddply(df, .(col1, col2, col3), transform, colSEM = colSD/sqrt(length(na.omit(colSD))))

对于那些对此解决方案如何演变感兴趣的人,请查看编辑历史记录。

于 2012-07-20T15:57:17.883 回答