Я заимствую набор данных из SPSS, подготовленный Руководством по выживанию в SPSS Джули Паллант, и запускаю его на R.
Я выбираю три столбца для проверки корреляции и значимости: toptim, tnegaff, sex. Я выбираю столбцы с помощью select: df <- survey %>% select(toptim, tnegaff, sex)
.
Потом появляются проблемы.
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
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
Как я могу получить результат? Могу я узнать причину такой неудачи?
Спасибо за ваши ответы заранее.
Он пытается использовать все значения и, полагаю, сталкивается с NA
s. Если вы настроите использовать "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])
Я не уверен, как это было сделано в прошлых примерах с использованием 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])
(запустив вышеуказанную функцию, я получаю 0,0486, что кажется согласованным)
Да, кажется, ваш ответ в правильном направлении. Спасибо!
На самом деле учебник предлагает перейти на этот сайт, ввести вручную n и cor, чтобы найти результат: vassarstats.net/rdiff.html
Да, нашел это, когда искал книгу. полезно, что он приходит к тому же выводу. Добавили ссылку и последний фрагмент кода в ответ, если вы хотите проверить и отметить как решенный, если он соответствует вашим вопросам :)
Спасибо за помощь @andy-baxter. На самом деле тест значимости, который я хотел бы выяснить, - это наличие гендерных различий, а не p-значение для каждого пола. Есть ли способ справиться с этим? Ответ должен быть p = 0,0488, и есть гендерная разница.