Рассчитайте d Коэна в разных группах в R - PullRequest
0 голосов
/ 18 октября 2018

У меня есть фрейм данных от 4 участников (идентифицированных через id) с переменными a и b, которые были измерены в три разных времени:

  • pre
  • post1
  • post2

И мне нужно рассчитать величину эффекта (d Коэна) для изменений между:

  • pre до post1
  • post1 до post2

По каждой из переменных (a и b).

Есть ли способ, которым я могу использовать purrr::map для его расчета?

Данные:

library(tidyverse)
set.seed(1234)

df <- data.frame(
  vars = rep(letters[1:2], 12),
  value = sample(1:100, 24),
  phase = rep(factor(c("pre","post1","post2"), levels = c("pre","post1","post2")),4)
)

В моем ожидаемом выходе , ясначала посчитайте% изменения, а затем я получу среднее значение.Наконец, мой последний столбец d - это размер эффекта.Код для его генерации:

library(effsize)

## Calculate Effect Size for `a` in `pre` - `post1`

a1 <- df %>% 
  filter(vars == "a" & phase != "post2") %>% 
  mutate(phase = fct_drop(phase)) %>%
  cohen.d(value ~ phase, data = ., paired = T) %>% 
  .$estimate

## Calculate Effect Size for `a` in `post1` - `post2`

a2 <- df %>% 
  filter(vars == "a" & phase != "pre") %>% 
  mutate(phase = fct_drop(phase)) %>%
  cohen.d(value ~ phase, data = ., paired = T) %>% 
  .$estimate

## Calculate Effect Size for `b` in `pre` - `post1`

b1 <- df %>% 
  filter(vars == "b" & phase != "post2") %>% 
  mutate(phase = fct_drop(phase)) %>%
  cohen.d(value ~ phase, data = ., paired = T) %>% 
  .$estimate

## Calculate Effect Size for `b` in `post1` - `post2`

b2 <- df %>% 
  filter(vars == "b" & phase != "pre") %>% 
  mutate(phase = fct_drop(phase)) %>%
  cohen.d(value ~ phase, data = ., paired = T) %>% 
  .$estimate

# Mutate eff sizes to data frame
df %>% 
  spread(phase, value) %>% 
  mutate("pre - post1" = (post1/pre-1)*100, "post1 - post2" = (post2/post1-1)*100) %>%  # calculate % change
  select(-pre, -post1, -post2) %>%  
  gather("phase", "pct_change", 3:4) %>%
  group_by(phase, vars) %>% 
  summarise(Mean_pct_change = mean(pct_change)) %>% # calculate mean % change
  ungroup() %>% 
  mutate(d = c(a2, b2, a1, b1)) # mutate effect sizes

# A tibble: 4 x 4
  phase         vars  Mean_pct_change      d
  <chr>         <fct>           <dbl>  <dbl>
1 post1 - post2 a               158.  -0.988
2 post1 - post2 b               -37.1  0.558
3 pre - post1   a               690.  -3.36 
4 pre - post1   b                11.6 -0.383

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вот способ использования purrr.Похоже, суть вашей проблемы состоит в том, чтобы получить вектор оценок размера эффекта, который вы сейчас сохраняете как отдельные векторы, поэтому я обращаюсь только к получению этого вектора (то есть к тому, что вы извлекаете с помощью .$estimate.

Я сохранил два вектора, одну из переменных, которые вы используете: "a" "a" "b" "b"

И одну из фаз в исключите : "post2" "pre" "post2" "pre"

Функции purrr::map2_* позволяют отображать вдоль этих двух векторов и для каждой итерации брать переменную, которую нужно сохранить, и фазу, которую нужно исключить. Вычисление - это то, что у вас уже было (кроме замены .$estimate на возможно более аккуратную [[).Если бы я использовал map2, я бы получил список числовых векторов, каждый из которых имеет длину 1. Но используя map2_dbl, вы получите один числовой вектор из всех возвращаемых значений.

library(tidyverse)
library(effsize)

vars <- rep(c("a", "b"), each = 2)
excl_phase <- rep(c("post2", "pre"), times = 2)

map2_dbl(vars, excl_phase, function(v, p) {
  df %>%
    filter(vars == v, phase != p) %>%
    mutate(phase = fct_drop(phase)) %>%
    cohen.d(value ~ phase, data = ., paired = T) %>%
    `[[`("estimate")
})
#> [1] -1.5663301  0.2495671 -0.2716963  0.0659341

Сохраните этот вектори используйте его, как и прежде, в своем обобщении.

0 голосов
/ 18 октября 2018

Если вы можете согласиться на базу R, вот решение.

library(effsize)

f <- list(c("pre", "post1"), c("post1", "post2"))

res <- lapply(split(df, df$vars), function(DF)
  sapply(f, function(g) {
    D <- subset(DF, phase %in% g)
    D$phase <- fct_drop(D$phase)
    cohen.d(value ~ phase, data = D, paired = TRUE)$estimate
  })
)

res
#$a
#[1] -1.5663301  0.2495671
#
#$b
#[1] -0.2716963  0.0659341
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...