Преобразование функций в манекены

У меня есть такая матрица:

quimio = matrix(c(51,33,16,58,29,13,48,42,30,26,38,16), 
            nrow = 4, ncol = 3)

colnames(quimio) = c("Pouca", "Média", "Alta")
rownames(quimio) = c("Tipo I", "Tipo II", "Tipo III", "Tipo IV")

Это выглядит так:

          Pouca Média Alta
Tipo I      51    29   30
Tipo II     33    13   26
Tipo III    16    48   38
Tipo IV     58    42   16

Я хочу превратить его в тиббл, чтобы все имена строк и столбцов были фиктивными переменными.

Я хотел сделать гистограмму и получил вот что:

library(tidyverse)

tipo = c("Tipo I", "Tipo II", "Tipo III", "Tipo IV")

tipos = rep(tipo, 3)

quimiotb = as.tibble(quimio)
quimiotb = gather(quimiotb)
quimiotb$tipo = tipos

quimiotb = rename(quimiotb, reacao = key)
quimiotb$reacao = factor(quimiotb$reacao)
quimiotb$tipo = factor(quimiotb$tipo)

Вот что я получаю:

A tibble: 12 x 3
reacao value tipo    
<fct>  <dbl> <fct>   
1 Pouca     51 Tipo I  
2 Pouca     33 Tipo II 
3 Pouca     16 Tipo III
4 Pouca     58 Tipo IV 
5 Média     29 Tipo I  
6 Média     13 Tipo II 
7 Média     48 Tipo III
8 Média     42 Tipo IV 
9 Alta      30 Tipo I  
10 Alta     26 Tipo II 
11 Alta     38 Tipo III
12 Alta     16 Tipo IV 

И хотя это вполне нормально использовать для гистограммы с ggplot2, я не могу запустить на нем какую-либо модель - для этого потребуется, чтобы tipo был разбит на 4 столбца и reacao - на 3. Прямо сейчас первая строка этой таблицы читается как "51 пациент с типо у меня рак имел pouca reacao ". Я думал об использовании spread(), но не могу найти правильную комбинацию аргументов. Любая помощь будет оценена по достоинству.

tl;dr

Мне нужно привести в порядок quimiotb и не знаю как

РЕДАКТИРОВАТЬ: ожидаемый результат должен быть примерно таким

  A tibble: Y x 7
  Pouca Media Alta Tipo I Tipo II Tipo III Tipo IV    
  <fct> <fct> <fct> <fct>  <fct>   <fct>     <fct>
1   0     1    0      0      1       0         0
2   1     0    0      1      0       0         0

person Pedro Cavalcante    schedule 09.12.2018    source источник
comment
Пожалуйста, также добавьте хотя бы небольшую часть ожидаемого результата.   -  person Julius Vainora    schedule 09.12.2018
comment
R редко, если вообще когда-либо, требуется явное преобразование факторов в фиктивные, функции моделирования позаботятся об этом гораздо более проверенным и безопасным способом.   -  person Rui Barradas    schedule 09.12.2018
comment
Я просто хочу запустить ANOVA, чтобы оценить, связано ли tipo с reacao   -  person Pedro Cavalcante    schedule 09.12.2018


Ответы (3)


Подпрограммы моделирования создадут для вас модель model.matrix без необходимости указывать ее, поэтому этого должно быть достаточно.

as.data.frame.table(quimio)

model.matrix может создать из этого матрицу модели, но она вам не нужна, как показано в приведенном ниже коде.

Теперь вы делаете такие вещи, как:

DF <- as.data.frame.table(quimio)
fm0 <- lm(Freq ~ Var1, DF) # or maybe you want Var2?
fm1 <- lm(Freq ~ Var1 + Var2, DF) 
anova(fm0, fm1) # compare

или посмотрите t-тесты коэффициентов Var2 в выходных данных summary(fm1), чтобы увидеть, существенно ли они отличаются от нуля.

Или, может быть, вы хотите провести тест хи-квадрат на исходных данных

chisq.test(quimio)

В любом случае в R есть много функций моделирования, и теперь у вас есть данные в нужной вам форме, и вы можете их исследовать.

person G. Grothendieck    schedule 09.12.2018
comment
Но как мне тогда указать формулу для модели? - person Pedro Cavalcante; 09.12.2018
comment
Допустим, я хочу провести ANOVA, чтобы увидеть, связан ли тип рака с reacao. Как указать формулу модели? - person Pedro Cavalcante; 09.12.2018
comment
Перенесли свои комментарии в ответ. - person G. Grothendieck; 09.12.2018

Менее элегантно, чем я хотел, но должно работать с data.table и mltools:

> df
    Tipo I Tipo II Tipo III Tipo IV Alta Média Pouca value
 1:      1       0        0       0    0     0     1    51
 2:      0       1        0       0    0     0     1    33
 3:      0       0        1       0    0     0     1    16
 4:      0       0        0       1    0     0     1    58
 5:      1       0        0       0    0     1     0    29
 6:      0       1        0       0    0     1     0    13
 7:      0       0        1       0    0     1     0    48
 8:      0       0        0       1    0     1     0    42
 9:      1       0        0       0    1     0     0    30
10:      0       1        0       0    1     0     0    26
11:      0       0        1       0    1     0     0    38
12:      0       0        0       1    1     0     0    16

Код

library(data.table)
library(mltools)

df <- quimio %>% 
    as.data.frame() %>%
    rownames_to_column() %>%
    gather(key, value, -rowname) %>%
    mutate(rowname = as.factor(rowname),
           key = as.factor(key)) %>%
    as.data.table() %>%
    one_hot() %>% 
    rename_all(.funs = funs(sub("^.+_", "", names(df))))
person Roman    schedule 09.12.2018

Другой вариант был бы

fun <- function(x, y) setNames(tibble(a = 1, b = 1)[rep(1, quimio[x, y]), ], c(rownames(quimio)[x], colnames(quimio)[y]))
1 * !is.na(map2_dfr(row(quimio), col(quimio), fun))
#      Tipo I Pouca Tipo II Tipo III Tipo IV Média Alta
# [1,]      1     1       0        0       0     0    0
# [2,]      1     1       0        0       0     0    0
# [3,]      1     1       0        0       0     0    0
# ...

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

person Julius Vainora    schedule 09.12.2018