2014-07-25 2 views
1

Я пытаюсь вычислить корреляцию между двумя числовыми столбцами в кадре данных для каждого уровня фактора. Ниже приведен пример кадр данных:R: cor.test по группе с ddply

concentration <-(c(3, 8, 4, 7, 3, 1, 3, 3, 8, 6)) 
area <-c(0.5, 0.9, 0.3, 0.4, 0.5, 0.8, 0.9, 0.2, 0.7, 0.7) 
area_type <-c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B") 
data_frame <-data.frame(concentration, area, area_type) 

В этом примере, я хочу, чтобы вычислить корреляцию между концентрацией и областью для каждого уровня area_type. Я хочу использовать cor.test, а не cor, потому что мне нужны значения p и kendall tau. Я пытался сделать это с помощью ddply:

ddply(data_frame, "area_type", summarise, 
    corr=(cor.test(data_frame$area, data_frame$concentration, 
       alternative="two.sided", method="kendall"))) 

Однако меня возникли проблемы с выходом: она организована по-разному от обычного Kendall cor.test выхода, который гласит г значение, р-значение, альтернативный гипотезы и оценки тау. Вместо этого я получаю вывод ниже. Я не знаю, что указывает каждая строка вывода. Кроме того, выходные значения одинаковы для каждого уровня area_type.

area_type           corr 
1   A         0.3766218 
2   A           NULL 
3   A         0.7064547 
4   A         0.1001252 
5   A           0 
6   A         two.sided 
7   A    Kendall's rank correlation tau 
8   A data_frame$area and data_frame$concentration 
9   B         0.3766218 
10   B           NULL 
11   B         0.7064547 
12   B         0.1001252 
13   B           0 
14   B         two.sided 
15   B    Kendall's rank correlation tau 
16   B data_frame$area and data_frame$concentration 

Что я делаю неправильно с ddply? Или есть другие способы сделать это? Благодарю.

ответ

5

Вы можете добавить дополнительную колонку с названиями корр. Кроме того, ваш синтаксис немного некорректен. . указывает, что переменная указана из указанного вами фрейма данных. Затем удалите data_frame $ или иначе он будет использовать весь кадр данных:

ddply(data_frame, .(area_type), summarise, corr=(cor.test(area, concentration, alternative="two.sided", method="kendall")), name=names(corr))

Что дает:

area_type       corr  name 
1   A      -0.285133 statistic 
2   A       NULL parameter 
3   A      0.7755423  p.value 
4   A      -0.1259882 estimate 
5   A        0 null.value 
6   A      two.sided alternative 
7   A Kendall's rank correlation tau  method 
8   A   area and concentration data.name 
9   B        6 statistic 
10   B       NULL parameter 
11   B      0.8166667  p.value 
12   B       0.2 estimate 
13   B        0 null.value 
14   B      two.sided alternative 
15   B Kendall's rank correlation tau  method 
16   B   area and concentration data.name 

статистики является г-значение и оценка является оценка тау.

EDIT: Вы также можете сделать это так, чтобы только тянуть, что вы хотите:

corfun<-function(x, y) { 
    corr=(cor.test(x, y, 
       alternative="two.sided", method="kendall")) 
} 

ddply(data_frame, .(area_type), summarise,z=corfun(area,concentration)$statistic, 
     pval=corfun(area,concentration)$p.value, 
     tau.est=corfun(area,concentration)$estimate, 
     alt=corfun(area,concentration)$alternative 
    ) 

Что дает:

area_type z pval tau.est alt 1 A -0.285133 0.7755423 -0.1259882 two.sided 2 B 6.000000 0.8166667 0.2000000 two.sided

+0

Ваше предложение действительно помогает маркировать выходные данные. Тем не менее, все еще существует проблема, что статистика одинакова для каждого уровня area_type. В этом примере результаты корреляции должны быть разными для каждого уровня area_type. Таким образом, по-видимому, что-то не так, как я использую ddply. – user3791234

+0

К сожалению, я не заметил эту часть. Я отредактировал свой ответ. –

+0

Спасибо. ваше редактирование отлично работает. – user3791234

0

Одной из причин этого не работает является кор .test возвращает:

Pearson's product-moment correlation 

data: data_frame$concentration and data_frame$area 
t = 0.5047, df = 8, p-value = 0.6274 
alternative hypothesis: true correlation is not equal to 0 
95 percent confidence interval: 
-0.5104148 0.7250936 
sample estimates: 
    cor 
    0.1756652 

Данную информацию нельзя добавить в объявление ata.frame (что делает ddply) без дальнейшего усложнения кода. Если вы можете предоставить точную информацию, которая вам нужна, я могу оказать дополнительную помощь. Я хотел бы посмотреть на только с помощью

corrTest <- ddply(.data = data_frame, 
       .variables = .(area_type), 
       .fun = cor(concentration, area,)) 
           method="kendall"))) 

Я не проверить этот код, но это маршрут, я бы изначально и работать здесь.

+0

Я хочу вывести статистику (z-значение), p-значение и оценку (tau) для каждого уровня area_type. – user3791234

Смежные вопросы