Ошибка при использовании group_by и суммировании при выполнении корреляции и проверки значимости с набором данных SPSS

Я заимствую набор данных из SPSS, подготовленный Руководством по выживанию в SPSS Джули Паллант, и запускаю его на R.

Я выбираю три столбца для проверки корреляции и значимости: toptim, tnegaff, sex. Я выбираю столбцы с помощью select: df <- survey %>% select(toptim, tnegaff, sex).

Потом появляются проблемы.

  1. Я хотел бы знать корреляцию между toptim и tnegaff по полу. Но я не могу использовать cor и прибегаю к correlate. Почему возникает ошибка и какая разница между двумя методами?

df %>% group_by(sex) %>% summarise(cor = correlate(toptim, tnegaff)) <- ОК (мужчины = 0,22 женщины = 0,394)

df %>% group_by(sex) %>% summarise(cor = cor(toptim, tnegaff)) <- не удалось, возвращается с NA

  1. Мне не удалось получить тест значимости с помощью cor.test (ответ должен быть p = 0,0488)
Error in `summarise()`:
! Problem while computing `cor = cor.test(toptim, tnegaff)`.
✖ `cor` must be a vector, not a `htest` object.
ℹ The error occurred in group 1: sex = 1.

Затем я пытаюсь следовать прошлым примерам и использовать broom::tidy, но не выводит p-значения....

> df %>% group_by(sex) %>% broom::tidy(cor.test(toptim, tnegaff))
# A tibble: 3 × 13
  column      n  mean    sd median trimmed   mad   min   max range   skew kurtosis     se
  <chr>   <dbl> <dbl> <dbl>  <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>    <dbl>  <dbl>
1 toptim    435 22.1  4.43      22   22.3      3     7    30    23 NA        NA    0.212 
2 tnegaff   435 19.4  7.07      18   18.6      4    10    39    29 NA        NA    0.339 
3 sex       439  1.58 0.494      2    1.58     0     1     2     1 -0.318     1.10 0.0236

Как я могу получить результат? Могу я узнать причину такой неудачи?

Спасибо за ваши ответы заранее.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Он пытается использовать все значения и, полагаю, сталкивается с NAs. Если вы настроите использовать "complete.obs", это должно сработать. Для части cor.test оберните вывод в функцию list, чтобы использовать возможности таблицы для получения столбца вектора объектов.

Для окончательной очистки и получения p-значений используйте map(cor.test, broom::tidy), а затем tidyr::unnest(), чтобы получить полный и аккуратный фрейм данных.

Это несколько шагов, чтобы пройти, но надеюсь, что это поможет!

df <- haven::read_sav("survey.sav")

library(tidyverse)

df %>% 
  group_by(sex) %>%
  summarise(cor = cor(toptim, tnegaff, use = "complete.obs"),
            cor.test = list(cor.test(toptim, tnegaff))) %>%
  mutate(tidy_out = map(cor.test, broom::tidy)) %>%
  unnest(tidy_out)
#> # A tibble: 2 × 11
#>   sex        cor cor.t…¹ estim…² stati…³  p.value param…⁴ conf.…⁵ conf.…⁶ method
#>   <dbl+l>  <dbl> <list>    <dbl>   <dbl>    <dbl>   <int>   <dbl>   <dbl> <chr> 
#> 1 1 [MAL… -0.220 <htest>  -0.220   -3.04 2.73e- 3     182  -0.353 -0.0775 Pears…
#> 2 2 [FEM… -0.394 <htest>  -0.394   -6.75 1.06e-10     248  -0.494 -0.284  Pears…
#> # … with 1 more variable: alternative <chr>, and abbreviated variable names
#> #   ¹​cor.test, ²​estimate, ³​statistic, ⁴​parameter, ⁵​conf.low, ⁶​conf.high

Редактировать - изучение разницы в корреляции

Заимствуя функцию из здесь, вы можете исследовать разницу коэффициентов корреляции между полами следующим образом:

cor.diff.test(df$toptim[df$sex == 1], df$tnegaff[df$sex == 1], df$toptim[df$sex == 2], df$tnegaff[df$sex == 2])

Спасибо за помощь @andy-baxter. На самом деле тест значимости, который я хотел бы выяснить, - это наличие гендерных различий, а не p-значение для каждого пола. Есть ли способ справиться с этим? Ответ должен быть p = 0,0488, и есть гендерная разница.

ronzenith 22.11.2022 17:06

Я не уверен, как это было сделано в прошлых примерах с использованием broom::tidy - у вас есть ссылка на это? Заимствуя функцию из здесь можно сделать так: cor.diff.test(df$toptim[df$sex == 1], df$tnegaff[df$sex == 1], df$toptim[df$sex == 2], df$tnegaff[df$sex == 2])

Andy Baxter 22.11.2022 17:48

(запустив вышеуказанную функцию, я получаю 0,0486, что кажется согласованным)

Andy Baxter 22.11.2022 17:50

Да, кажется, ваш ответ в правильном направлении. Спасибо!

ronzenith 22.11.2022 17:58

На самом деле учебник предлагает перейти на этот сайт, ввести вручную n и cor, чтобы найти результат: vassarstats.net/rdiff.html

ronzenith 22.11.2022 18:07

Да, нашел это, когда искал книгу. полезно, что он приходит к тому же выводу. Добавили ссылку и последний фрагмент кода в ответ, если вы хотите проверить и отметить как решенный, если он соответствует вашим вопросам :)

Andy Baxter 22.11.2022 18:10

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