Как указать две переменные как равные уровни фактора? - PullRequest
0 голосов
/ 10 октября 2019

В моем наборе данных есть переменная с именем Condition. Я смоделировал это как фактор с двумя уровнями: Control и Treatment. В том же фрейме данных у меня также есть переменные: Fish1, Fish2, Frechfires1, Frenchfries2. Я хочу смоделировать эти 'Ordinalvariables' как уровни в группе лечения с Fish выше, чем fries! В то же время я хочу, чтобы уровень Fish1 и Fish2 был одинаковым и одинаковым для fries1 & 2 - все для Treatment (который является уровнем переменной Condition).

Для подбора смешанной модели: Здоровье ~ Состояние () Принимая во внимание эффект Fish & Fries

Condition  SubNum  Trial Num_Fish1 Num_Fish2 Num_Fries1 Num_Fries2  Health
Treatment   1        1     1           1          2        1          3
Treatment   1        2     0           3          4        1          5
Control     2        1     0           0          0        0          4
Control     2        2     0           0          0        0          5

1 Ответ

1 голос
/ 10 октября 2019

Если я правильно понимаю вопрос, то вам действительно нужны упорядоченные уровни факторов «Рыба» и «Картошка», с некоторыми дополнительными различиями на каждом уровне, представленными цифрами 1 и 2.

Использование следующих данных:

df <- read.table(text = "Condition  SubNum  Trial Num_Fish1 Num_Fish2 Num_Fries1 Num_Fries2  Health
Treatment   1        1     1           1          2        1          3
Treatment   1        2     0           3          4        1          5
Control     2        1     0           0          0        0          4
Control     2        2     0           0          0        0          5", header = T)

Я бы использовал tidyr::gather(), чтобы поместить имена столбцов Num_* в переменную product, а затем извлечь типы продуктов и номера продуктов в упорядоченные и неупорядоченные коэффициенты соответственно.

library(tidyr)
library(dplyr)
library(stringr)

df_out <- df %>% 
    gather("product", "product_value", -c(Condition:Trial, Health)) %>% 
    mutate(product_num = factor(str_match(product, "\\d")),
           product = ordered(str_remove_all(product, "Num_|\\d"),
                             levels = c("Fries", "Fish")
                             )
    )

В итоге вы должны получить фрейм данных, подобный приведенному ниже, который можно использовать для гибкого сравнения «Рыба» с «Фри» (порядковый номер) или «Рыба 1» с «Рыба 2» (в обоихпадежи просто «рыба» (по существу, номинальные) и т. д. Я преобразовал product_num в фактор, а не в целочисленный вектор, чтобы избежать путаницы, которая может быть вызвана внутренним порядком целых чисел. В зависимости от вашей стратегии моделирования вам, возможно, все же потребуется поднастроить и / или перераспределить данные.

# A tibble: 16 x 7
   Condition SubNum Trial Health product product_value product_num
   <fct>      <int> <int>  <int> <ord>           <int> <fct>      
 1 Treatment      1     1      3 Fish                1 1          
 2 Treatment      1     2      5 Fish                0 1          
 3 Control        2     1      4 Fish                0 1          
 4 Control        2     2      5 Fish                0 1          
 5 Treatment      1     1      3 Fish                1 2          
 6 Treatment      1     2      5 Fish                3 2          
 7 Control        2     1      4 Fish                0 2          
 8 Control        2     2      5 Fish                0 2          
 9 Treatment      1     1      3 Fries               2 1          
10 Treatment      1     2      5 Fries               4 1          
11 Control        2     1      4 Fries               0 1          
12 Control        2     2      5 Fries               0 1          
13 Treatment      1     1      3 Fries               1 2          
14 Treatment      1     2      5 Fries               1 2          
15 Control        2     1      4 Fries               0 2          
16 Control        2     2      5 Fries               0 2          
...