Парный T-тест по нескольким парным столбцам (широкий формат данных)

Я преобразовал фрейм данных в широкий формат и теперь хочу вычислить парные t-тесты для получения p-значений. Мне удалось сделать это для каждой пары столбцов индивидуально, но это намного больше кода, чем я считаю необходимым. Я все еще новичок в R, данных и кодировании в целом, и не мог легко найти решение здесь, в Stack Overflow.

Мой широкий фрейм данных:

> head(df_wide)
# A tibble: 6 x 21
Assessor `Appearance1  `Appearance2    `Aroma_1   `Aroma_2   `Flavour_1   `Flavour_2
<dbl>     <dbl>             <dbl>        <dbl>       <dbl>        <dbl>      <dbl>
1          10                10           10         10            10          10
2           6                 7            7          5             8           4

# ... with 14 more variables

Я хочу выполнить парный T-тест для атрибутов, то есть Appearance1 и Appearance2, Aroma1 и Aroma2 и т. Д. Все 14 других переменных <dbl> и также являются атрибутами, которые должны быть включены в качестве парных столбцов для T-теста.

В идеале на выходе должен быть вектор только p-значений, а не вся информация. Мне удалось выполнить такое кодирование для отдельных пар, но я хотел знать, можно ли это сделать в рамках выполнения T-теста для нескольких пар столбцов.

Вот код, который у меня есть для первых двух атрибутов:

p_values <- c(t.test(df_wide$`Appearance1`, df_wide$`Appearance2`, paired = T)[["p.value"]],
               t.test(df_wide$`Aroma1`, df_wide$`Aroma2`, paired = T)[["p.value"]])

Это создает нужный мне вектор, но это громоздко и подвержено ошибкам. В идеале я мог бы выполнить это сразу для всех пар без необходимости использовать имена столбцов.

У меня есть исходный фрейм данных в длинном формате, если бы было проще сделать это с его помощью (РЕДАКТИРОВАТЬ: использовалось dput() для первых 20 строк вместо head():

> dput(df_test[1:20,])
structure(list(Assessor = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10),
Product = c("MC", "MV", "MC", "MV", "MV", "MC", "MC", "MV", "MV", "MC", "MC", "MV", "MC", "MV", "MC", "MV", "MV", "MC", "MV", "MC"),
Appearance = c(10, 10, 6, 7, 9, 6, 7, 8, 9, 8, 10, 8, 6, 6, 9, 8, 8, 8, 9, 9),
Aroma = c(10, 10, 7, 5, 9, 8, 6, 7, 5, 7, 9, 8, 6, 6, 5, 3, 6, 7, 9, 6),
Flavour = c(10, 10, 8, 4, 10, 7, 7, 6, 8, 8, 9, 10, 8, 8, 6, 8, 7, 9, 9, 8),
Texture = c(10, 10, 8, 8, 9, 6, 7, 8, 8, 8, 9, 10, 8, 8, 9, 8, 8, 9, 9, 8),
`JAR Colour` = c(3, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3),
`JAR Strength Chocolate` = c(2, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 2),
`JAR Strength Vanilla` = c(3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 2, 3, 3, 3, 2, 2, 3, 3, 2, 3),
`JAR Sweetness` = c(2, 3, 3, 1, 3, 2, 2, 2, 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3),
`JAR Creaminess` = c(3, 3, 3, 3, 3, 1, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3),
`Overall Acceptance` = c(9, 10, 8, 4, 10, 5, 7, 7, 8, 8, 9, 10, 8, 8, 8, 8, 8, 9, 8, 8)),
row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

Переменная Product - это та переменная, которая использовалась для создания парных столбцов в широкоформатном фрейме данных. Заранее спасибо.


person Dee G    schedule 22.06.2021    source источник


Ответы (1)


если я правильно понимаю

df <- structure(list(Assessor = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10),
               Product = c("MC", "MV", "MC", "MV", "MV", "MC", "MC", "MV", "MV", "MC", "MC", "MV", "MC", "MV", "MC", "MV", "MV", "MC", "MV", "MC"),
               Appearance = c(10, 10, 6, 7, 9, 6, 7, 8, 9, 8, 10, 8, 6, 6, 9, 8, 8, 8, 9, 9),
               Aroma = c(10, 10, 7, 5, 9, 8, 6, 7, 5, 7, 9, 8, 6, 6, 5, 3, 6, 7, 9, 6),
               Flavour = c(10, 10, 8, 4, 10, 7, 7, 6, 8, 8, 9, 10, 8, 8, 6, 8, 7, 9, 9, 8),
               Texture = c(10, 10, 8, 8, 9, 6, 7, 8, 8, 8, 9, 10, 8, 8, 9, 8, 8, 9, 9, 8),
               `JAR Colour` = c(3, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3),
               `JAR Strength Chocolate` = c(2, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 2),
               `JAR Strength Vanilla` = c(3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 2, 3, 3, 3, 2, 2, 3, 3, 2, 3),
               `JAR Sweetness` = c(2, 3, 3, 1, 3, 2, 2, 2, 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3),
               `JAR Creaminess` = c(3, 3, 3, 3, 3, 1, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3),
               `Overall Acceptance` = c(9, 10, 8, 4, 10, 5, 7, 7, 8, 8, 9, 10, 8, 8, 8, 8, 8, 9, 8, 8)),
          row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

head(df)
#> # A tibble: 6 x 12
#>   Assessor Product Appearance Aroma Flavour Texture `JAR Colour`
#>      <dbl> <chr>        <dbl> <dbl>   <dbl>   <dbl>        <dbl>
#> 1        1 MC              10    10      10      10            3
#> 2        1 MV              10    10      10      10            2
#> 3        2 MC               6     7       8       8            2
#> 4        2 MV               7     5       4       8            3
#> 5        3 MV               9     9      10       9            3
#> 6        3 MC               6     8       7       6            3
#> # ... with 5 more variables: JAR Strength Chocolate <dbl>,
#> #   JAR Strength Vanilla <dbl>, JAR Sweetness <dbl>, JAR Creaminess <dbl>,
#> #   Overall Acceptance <dbl>

library(tidyverse)
map_df(df[-c(1:2)], ~t.test(.x ~ df$Product, paired = TRUE)$p.value)
#> # A tibble: 1 x 10
#>   Appearance Aroma Flavour Texture `JAR Colour` `JAR Strength Chocolate`
#>        <dbl> <dbl>   <dbl>   <dbl>        <dbl>                    <dbl>
#> 1      0.496 0.576       1   0.309        0.678                        1
#> # ... with 4 more variables: JAR Strength Vanilla <dbl>, JAR Sweetness <dbl>,
#> #   JAR Creaminess <dbl>, Overall Acceptance <dbl>

sapply(df[-c(1:2)], function(x) t.test(x ~ df$Product, paired = TRUE)$p.value)
#>             Appearance                  Aroma                Flavour 
#>              0.4961016              0.5763122              1.0000000 
#>                Texture             JAR Colour JAR Strength Chocolate 
#>              0.3092332              0.6783097              1.0000000 
#>   JAR Strength Vanilla          JAR Sweetness         JAR Creaminess 
#>              0.6783097              1.0000000              0.4433319 
#>     Overall Acceptance 
#>              0.7803523

Создано 22.06.2021 с помощью пакета REPEX (v2.0.0)

person Yuriy Saraykin    schedule 22.06.2021
comment
Error in complete.cases(x, y) : not all arguments have the same length. Я не знаю, связано ли это с тем, что мой фрейм данных длинного формата содержит гораздо больше строк, чем те, которые я включил в head(df)? Чтобы прояснить, я хочу, чтобы результат был векторным, чтобы потом я мог cbind его потом преобразовать в таблицу, которая имеет все атрибуты в виде заголовков строк. - person Dee G; 22.06.2021
comment
показать пример расширенных данных, используя dput(df_test) - person Yuriy Saraykin; 22.06.2021
comment
Это 208 строк (104 оценщика), поэтому он слишком велик для комментария. Я мог бы внести это как правку в исходный вопрос, но все равно это будет очень долго! - person Dee G; 22.06.2021
comment
вам не нужно показывать все строки. 20-30 строк достаточно - person Yuriy Saraykin; 22.06.2021
comment
Я отредактировал исходный вопрос, чтобы включить вывод dput () для первых 20 строк. - person Dee G; 22.06.2021
comment
ошибка, вероятно, связана с тем, что у вас есть пробелы в данных. Попробуйте запустить table(df$Product). количество MC и MV должно быть равным - person Yuriy Saraykin; 22.06.2021
comment
Я понимаю, что моя ошибка возникла из-за того, что я не указал правильные идентификаторы фреймов данных. Я случайно имел в виду одну с пропущенными значениями. Есть ли способ изменить ваше решение так, чтобы у меня был вектор только p-значений? Код, который я использовал, делает это, но требует, чтобы я ссылался на все пары столбцов. Я включил свое решение в вопрос, но только первые две пары атрибутов, чтобы сэкономить время - person Dee G; 23.06.2021
comment
помогает ли код в ответе supply(df[-c(1:2)], function(x) t.test(x ~ df$Product, paired = TRUE)$p. value 'решить проблему? он выводит результаты в вектор - person Yuriy Saraykin; 23.06.2021
comment
о, извини, я пропустил эту часть. Единственное, что мне нужно в векторе, это буквально сами p-значения в порядке атрибутов (слева направо во фрейме данных df_test), т.е. > p_values [1] 0.275412629 0.244083447 0.044558648 0.052750753 0.007050864 0.056363225 0.879656878 0.006063213 0.495361458 0.007337490 Это то, что мой код возвращает в качестве вывода, но, как вы можете видеть из моих код в вопросе, он включает в себя кодирование отдельного t-теста для каждой пары. - person Dee G; 23.06.2021
comment
Позвольте нам продолжить это обсуждение в чате. - person Yuriy Saraykin; 23.06.2021