Стандартные ошибки каждого наблюдения среди сгруппированных данных во фрейме данных

У меня есть кадр данных, в котором я хотел бы рассчитать стандартную ошибку наблюдений, сгруппированных по факторам в трех столбцах. Стандартное отклонение и стандартная ошибка среднего значения групп были рассчитаны следующим образом с использованием 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...

person user1214160    schedule 20.07.2012    source источник
comment
Было бы здорово, если бы вы предоставили нам небольшой образец набора данных df и объяснили, как вы хотите, чтобы данные выглядели в конце. Попробуйте использовать dput(df), чтобы мы могли легко вырезать и вставлять, или просто используйте dput(head(df)), если df слишком велико.   -  person nograpes    schedule 20.07.2012
comment
Не меняйте вопрос на дополнительную задачу после того, как был дан ответ на исходную задачу. Я откатил ваше редактирование, чтобы восстановить первоначальный смысл вопроса. В противном случае ответы не будут применяться. Пожалуйста, либо добавьте небольшие дополнительные вопросы, не удаляя исходный вопрос, либо опубликуйте полностью новый вопрос, возможно, дав ссылку в комментарии здесь, чтобы сохранить тот же набор вопросов. заинтересованные люди. Какой из них подходит, зависит от масштаба последующей проблемы и степени взаимосвязи, но в данном случае, вероятно, последнее.   -  person MvG    schedule 20.07.2012


Ответы (1)


Вы можете получить очень компактное решение, используя ddply:

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

Для тех, кто интересуется развитием этого решения, загляните в историю редактирования.

person MvG    schedule 20.07.2012
comment
Спасибо! Он работает отлично! Однако у меня есть дополнительный вопрос относительно порядка строк при создании фрейма данных со средними значениями, sd и sem средних значений. Пожалуйста, смотрите выше. - person user1214160; 20.07.2012
comment
@ user1214160, вот еще более короткая версия, чем та, что была до моего последнего редактирования. - person MvG; 21.07.2012
comment
@ user1214160, не забудьте в конечном итоге принять ответ, если он вас устраивает. - person MvG; 17.11.2012