Преобразование функций в макеты - PullRequest
0 голосов
/ 09 декабря 2018

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

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 пациент с типо»У меня рак был Поука Реаао ".Я думал об использовании spread(), но не могу найти правильную комбинацию аргументов.Любая помощь будет оценена.

tl; др

Мне нужно привести в порядок 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

Ответы [ 3 ]

0 голосов
/ 09 декабря 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))))
0 голосов
/ 09 декабря 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 записей.

0 голосов
/ 09 декабря 2018

Процедуры моделирования создадут 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 есть много функций моделирования, и выТеперь получите данные в нужной форме и можете их изучить.

...