несколько значений категориальной переменной, GLM, model.matrix

У меня есть данные, которые выглядят так

    id var1 var2 var3 response var4
1   1    0 cat1    E        1   T4
2   1    0 cat1    E        1   T2
3   2    0 cat2    B        1 <NA>
4   3    0 cat3    C        0 <NA>
5   4    0 cat4    D        0   T3
6   4    0 cat4    D        0   T1
7   5    1 cat1    A        1   T4
8   5    1 cat1    A        1   T3
9   6    1 cat3    C        1   T3
10  7    0 cat1    C        0   T1

Я хочу запустить glm для зависимой переменной "response"

как вы можете видеть, идентификаторы не уникальны, потому что каждый идентификатор может принимать более одного значения для "var4",

с этой целью я пробовал model.matrix, но он не сохраняет идентификаторы, что затрудняет проверку результатов, я уверен, что есть простой способ сделать это, может ли кто-нибудь помочь?

для генерации вышеуказанных данных вы можете использовать

# GENERATING THE FIRST DATA FRAME

set.seed(1984)

df1 <- data.frame(id = 1:15, 
                  var1 = sample(0:1, 15, replace = T, prob = c(.7,.3)), 
                  var2 = sample(c('cat1','cat2', 'cat3','cat4'),15, replace = T), 
                  var3 = sample(LETTERS[1:5],15, replace = T ), 
                  response = sample(0:1, 15, replace = T)
                  )

# GENERATING THE 2ND DATA FRAME
set.seed(1984)

df2 <- data.frame(id = sample(1:15, 20, replace = T), 
                  var4 = sample(c('T1','T2','T3','T4'), 20, replace = T))

df2 <- unique(df2[order(df2$id), ])
row.names(df2) <- NULL

# MERGING THE TWO
df3 <- merge(df1, df2, by = 'id', all = T )

df3

person Mouad_Seridi    schedule 21.04.2017    source источник


Ответы (1)


Я бы изменил данные с помощью dcast из пакета reshape2. Это изменит ваши данные, так что каждый идентификатор находится в одной строке и с одним горячим кодированием var4 перед загрузкой фрейма данных в model.matix. Используя ваш минимальный рабочий пример, это будет примерно так:

library(reashpe2)

newDF <- dcast(df3, ...~var4,function(x) length(x))
model.matrix(response ~., newDF)
person Ian Wesley    schedule 21.04.2017
comment
решение работает, спасибо !, есть ли способ обобщить метод на все категориальные переменные во фрейме данных (превратить все значения в фиктивные переменные)? - person Mouad_Seridi; 21.04.2017
comment
Я хочу убедиться, что понимаю ... пока каждый идентификатор уникален, model.matrix будет быстро кодировать любые оставшиеся категориальные переменные. Если у вас есть другие переменные, такие как var4, возможно, вы сможете настроить формулу в dcast, чтобы получить то, что вы хотите. Но как именно вы это сделаете, будет зависеть от ваших данных. - person Ian Wesley; 21.04.2017
comment
model.matrix ведет себя странно (исключая некоторые переменные, которые были введены dcast), есть ли способ с помощью reshape2 получить фрейм данных со всеми значениями категориальных переменных, превращенными в фиктивные переменные? - person Mouad_Seridi; 21.04.2017
comment
Эта проблема связана с данными, поэтому трудно сказать, что происходит ... Я бы рекомендовал выяснить, почему матрица модели ведет себя странно, а не просто использует dcast. В любом случае перед запуском glm вам нужно будет преобразовать данные в матрицу модели. - person Ian Wesley; 21.04.2017
comment
На самом деле это не так, Rstudio обрезает представление, снова спасибо. - person Mouad_Seridi; 22.04.2017