Непарный, но не спаренный цикл тестирования в R работает

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

Вот цикл, где "mydata" - это фрейм данных, на котором запускаются тесты. "mydata" представляет собой фрейм данных с 4 столбцами:

df <- mydata
mydf <- data.frame(c(1:4))

# this is the new dataframe being initialized to store my p-values

row.names(mydf) <- names(df)
for(i in names(df)){
  if(sd(df[[i]]) == 0) {

  # this prevents the loop from terminating and returning an error when ttests 
  # are run on columns with binary values 

  } else {
    ttest <- t.test(df[df$Pre==1,][[i]], df[df$Pre==2,][[i]], paired=FALSE)

    # 'Pre' is the column that groups my data into 
    # distinct cohorts. I am comparing the Pre cohort versus the Post cohort 
    # in these ttests.  

    mydf[i,1] <- ttest$p.value
  }
}
mydf

Вот мой вывод mydf для непарного (paired=FALSE) теста:

          c.1.4.                             
density 0.3569670
clust   0.9715987
Pre     3.0000000
HC      4.0000000

Однако, когда я меняю paired = FALSE на paired=TRUE (для запуска парного теста), вот mydf:

           c.1.4.
density      1
clust        2
Pre          3
HC           4

Я проверил эту строку моего цикла изолированно, используя первый столбец моего фрейма данных, '1' в двойных скобках (для парного = ИСТИНА), и он, похоже, выводит p-значение:

ttest <- t.test(df[df$Pre==1,][[1]], df[df$Pre==2,][[1]], paired=TRUE)
ttest$p.value
[1] 0.356967

Ниже приведен пример набора данных, который вы можете использовать для воспроизведения ошибки:

            density      clust      Pre HC
RDHC008A_13 0.47991     0.676825    1   1
RDHC009A_13 0.49955     0.696441    1   1
RDHC010A_16 0.491454    0.706507    1   1
RDHC013A_13 0.442879    0.689118    1   1
RDHC014A_13 0.453823    0.691603    1   1
RDHC016A_16 0.481259    0.706978    1   1
RDHC019A_06 0.515442    0.699514    1   1
RDHC021A_15 0.449925    0.685202    1   1
RDHC022A_12 0.461319    0.705446    1   1
RDHC023A_11 0.468816    0.667698    1   1
RDHC024A_12 0.515142    0.719474    1   1
RDHC025A_13 0.496702    0.710877    1   1
RDHC026A_12 0.477061    0.695061    1   1
RDHC027A_12 0.515442    0.722269    1   1
RDHC029A_12 0.406747    0.669998    1   1
RDHC030A_12 0.476162    0.69219     1   1
RDHC032B_13 0.50075     0.685474    1   1
RDHC034B_07 0.525487    0.725558    1   1
RDHC036B_07 0.468816    0.698904    1   1
RDHC038B_07 0.470015    0.706668    1   1
RDHC039B_07 0.511544    0.712818    1   1
RDHC041A_14 0.551574    0.732983    1   1
RDHC004C_12 0.486207    0.695121    2   1
RDHC005C_12 0.505997    0.695598    2   1
RDHC006C_13 0.487406    0.697044    2   1
RDHC013C_12 0.41979     0.685518    2   1
RDHC015C_13 0.297751    0.69632     2   1
RDHC016C_16 0.463718    0.700011    2   1
RDHC019C_14 0.508096    0.690071    2   1
RDHC021C_12 0.448426    0.688265    2   1
RDHC022C_12 0.468816    0.700968    2   1
RDHC024C_12 0.515292    0.70664     2   1
RDHC025C_13 0.473163    0.704231    2   1
RDHC027C_12 0.518741    0.732939    2   1
RDHC030C_11 0.489205    0.708174    2   1

Вы можете импортировать его, выполнив следующие действия:

скопируйте данные и вставьте их в кавычки кода ниже в R:

zz <- ""

Теперь назначьте данные для data.frame:

mydata <- read.table(text=zz, header=TRUE)

Я понятия не имею, почему изменение "парного" параметра на "ИСТИНА" может привести к этому. Любая помощь / совет будет высоко ценится. Спасибо - пол

1 ответ

Решение

Вы инициализируете mydf data.frame со значениями 1:4 здесь

mydf <- data.frame(c(1:4))

в основном цикл ничего не делает, потому что t.test выдает ошибку, когда вы делаете PAIRED=TRUE потому что ваши два набора значений не имеют одинаковую длину (и они должны быть при выполнении парного t-теста. У вас есть 22 значения, где Pre==1 и 13 значений, где Pre==2. Вы не можете сделать парный тест с таким дисбалансом.

Другие вопросы по тегам