3

我有一列包含每个参与者的组 ID。共有三组,因此该列中的每个数字都是 1、2 或 3。

然后我有第二列,其中包含每个参与者的响应分数。我想计算每个组内的平均/中值响应分数。

我已经设法通过遍历每一行来做到这一点,但我觉得这是一个缓慢且次优的解决方案。有人可以建议一种更好的做事方式吗?

4

3 回答 3

3

grpstats是一个很好的功能(文档here

这是嵌入式统计信息的列表:

  • '意思' 意思
  • 'sem' 均值的标准误
  • 'numel' 非 NaN 元素的计数或数量
  • 'gname' 组名
  • 'std' 标准差
  • 'var' 方差
  • 'min' 最小值
  • '最大' 最大值
  • '范围' 范围
  • 'meanci' 平均值的 95% 置信区间
  • 'predci' 新观测值的 95% 预测区间

它也接受函数句柄(例如:@mean@skeweness

>> groups = [1 1 1 2 2 2 3 3 3]';
>> data   = [0 0 1 0 1 1 1 1 1]';
>> grpstats(data, groups, {'mean'})
ans =

    0.3333
    0.6667
    1.0000

>> [mea, med] = grpstats(data, groups, {'mean', @median})

mea =

    0.3333
    0.6667
    1.0000


med =

     0
     1
     1
于 2013-10-10T12:46:30.133 回答
2

这是一个使用的好地方accumarray文档博客文章):

result = accumarray(groupIDs, data, [], @median);

您当然可以给出矩阵的一行或一列,而不是一个名为的变量groupIDs和另一个 for data。如果您更喜欢平均值而不是中位数,请@mean用作第四个参数。


注意:文档指出,如果您需要依赖输出的顺序,您应该对输入参数进行排序。不过,我会把这个练习留到另一天。

于 2013-01-22T12:14:04.020 回答
1

使用逻辑条件,例如假设您的数据在矩阵m中如下:第一个 col 是ID第二个 col 是响应分数,

mean(m(m(:,1)==1,2))
median(m(m(:,1)==1,2))

将为您提供1响应分数等的平均值和中位数

于 2013-01-22T10:17:34.060 回答