R - Несогласованное значение p при работе корреляции Спирмена - PullRequest
0 голосов
/ 13 мая 2018

Моя проблема заключается в том, что, когда я вычисляю текущую корреляцию по какой-то странной причине, я не получаю одно и то же значение p для тех же значений оценок / корреляций.

Моя цель - рассчитать текущую корреляцию Спирмена по двум векторам в одном и том же data.frame (subject1 и subject2 в примере ниже). Кроме того, мое окно (длина вектора) и stide (переходы / шаги между каждым окном) являются постоянными. Таким образом, при взгляде на формулу ниже (из wiki ) я должен получить тот же критический t, а значит, и то же значение p для той же корреляции Спирмена. Это потому, что n сообщает то же самое (это тот же размер окна), а r - то же самое. Тем не менее, мое конечное значение р отличается.

enter image description here

#Needed pkgs    
require(tidyverse)
require(pspearman)
require(gtools)

#Sample data
set.seed(528)
subject1 <- rnorm(40, mean = 85, sd = 5)

set.seed(528)
subject2 <- c(
  lag(subject1[1:21]) - 10, 
  rnorm(n = 6, mean = 85, sd = 5), 
  lag(subject1[length(subject1):28]) - 10)

df <- data.frame(subject1 = subject1, 
                 subject2 = subject2) %>% 
  rowid_to_column(var = "Time") 

df[is.na(df)] <- subject1[1] - 10

rm(subject1, subject2)

#Function for Spearman
psSpearman <- function(x, y) 
{
  out <- pspearman::spearman.test(x, y,
                                  alternative = "two.sided", 
                                  approximation = "t-distribution") %>% 
    broom::tidy()
  return(data.frame(estimate = out$estimate,
                    statistic = out$statistic,
                    p.value = out$p.value )
}

#Running correlation along the subjects
dfRunningCor <- running(df$subject1, df$subject2, 
                        fun = psSpearman,
                        width = 20,
                        allow.fewer = FALSE, 
                        by = 1,
                        pad = FALSE, 
                        align = "right") %>% 
  t() %>% 
  as.data.frame() 

#Arranging the Results into easy to handle data.frame 
Results <- do.call(rbind.data.frame, dfRunningCor) %>% 
  t() %>%
  as.data.frame() %>%
  rownames_to_column(var = "Win") %>% 
  gather(CorValue, Value, -Win) %>% 
  separate(Win, c("fromIndex", "toIndex")) %>%
  mutate(fromIndex = as.numeric(substring(fromIndex, 2)),
         toIndex = as.numeric(toIndex, 2)) %>%
  spread(CorValue, Value) %>% 
  arrange(fromIndex) %>% 
  select(fromIndex, toIndex, estimate, statistic, p.value)

Моя проблема заключается в том, что когда я строю Results с оценками (Spearman rho; estimate), номером окна (fromIndex) и я раскрашиваю значение p, я должен выглядеть как " Туннель "/" путь "одного цвета через ту же область - я не. Например, на рисунке ниже точки одинаковой высоты в красном круге должны быть одного цвета, но это не так. enter image description here

Код для графика:

Results %>% 
  ggplot(aes(fromIndex, estimate, color = p.value)) + 
  geom_line()

Что я нашел до сих пор , так это то, что это может быть связано с: 1. Такие функции, как Hmisc::rcorr(), как правило, не дают одно и то же значение p.value для небольшой выборки или множества связей. Вот почему я использую pspearman::spearman.test, что, как я прочитал здесь, предполагает решение этой проблемы. 2. Небольшой размер выборки - я пытался использовать больший размер выборки. У меня все та же проблема. 3. Я попытался округлить свои значения p - у меня все та же проблема.

Спасибо за вашу помощь!

Редактировать.

Может ли это быть"псевдо" окраска ggplot? Может быть, ggplot просто интерполирует "последний" цвет до следующей точки? Вот почему я получаю «светло-синий» из пункта 5–6, а «темно-синий» - из пункта 7–8?

enter image description here

1 Ответ

0 голосов
/ 13 мая 2018

Результаты, полученные для переменной p.value, соответствуют значению estimate. Вы можете проверить это следующим образом:

Results$orderestimate <- order(-abs(Results$estimate))
Results$orderp.value <- order(abs(Results$p.value))
identical(Results$orderestimate ,Results$orderp.value)

Я не думаю, что вы должны включать цвет для p.value в графике, это ненужное визуальное отвлечение и его трудно интерпретировать.

На вашем месте я бы отображал только p.value и, возможно, включал бы точку для обозначения знака переменной estimate.

p <- Results %>% 
  ggplot(aes(fromIndex,  p.value)) + 
  geom_line()

# If you want to display the sign of the estimate
Results$estimate.sign <- as.factor(sign(Results$estimate))
p+geom_point( aes(color = estimate.sign ))
...