«Корреляция и значение, если более 30 пар» с использованием R и ddply - PullRequest
1 голос
/ 15 марта 2012

Часть решения моей проблемы я нашел здесь: Как рассчитать корреляцию В R

set.seed(123)
X <- data.frame(ID = rep(1:2, each=5), a = sample(1:10), b = sample(1:10))
ddply(X, .(ID), summarize, cor_a_b = cor(a,b))

В дополнение к cor (который вычисляет Pearsons r) я вычисляю cor.test (для значения p). Но это терпит неудачу в случае «недостаточно конечных наблюдений», поэтому, когда некоторые идентификаторы являются одиночными, что довольно часто в моем случае.

Поэтому мне нужно вычислять r, только если существует более 30 пар данных или меньше, я хочу NA.

Вторая проблема заключается в том, что подробный вывод cor.test раздувает результирующий фрейм данных - даже если единственное, что я хотел, это p-значение. То есть, если р на самом деле, то, что я понимаю, что это. Это значение г?

Я знаю только t-критерий, чтобы вычислить значимость r.

{Формула t-критерия-значения: t = (r·(n-2)^0.5)/(1-r^2)^0.5) - но значение t еще не имеет значения, в противном случае я бы попытался внедрить формулу в оператор ddply}

1 Ответ

4 голосов
/ 15 марта 2012

попробуйте это:

> d <- data.frame(id = rep(1:3, c(5, 1, 10)), a = rnorm(16), b = rnorm(16))
> ddply(d, .(id), summarize, cor_a_b = if(length(id) < 3) {NA} else {cor.test(a, b)$p.value})
  id   cor_a_b
1  1 0.4393595
2  2        NA
3  3 0.5602855
...