Конвертируйте данные из широкого формата в длинный, сохраняя все альтернативы dv и добавляя переменную выбора - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь заставить мои данные работать с -пакетом в . Мне не удалось преобразовать широкий формат данных в длинный формат с помощью команды mlogit.data, поэтому я попробовал сам, используя melt.

Это то, что у меня есть (case - это идентификатор случая, dv будет зависимой переменной, table - данные в широком формате, newdata в длинном формате):

case<-c(1,2,3)
dv<-c(1,2,3)
table<-as.data.frame(cbind(IssueID, dv))

newdata<-melt(setDT(table), id.vars = c("IssueID"), measure.vars = c("dv"))

Широкий формат:

   case dv
1:    1  1
2:    2  2
3:    3  3

Длинный формат:

   IssueID variable value
1:       1       dv     1
2:       2       dv     2
3:       3       dv     3

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

Используемые данные должны выглядеть следующим образом:

#case2<-c(1,1,1,2,2,2,3,3,3)
#variable2<-(c("dv","dv","dv","dv","dv","dv","dv","dv","dv"))
#value2<-c(1,2,3,1,2,3,1,2,3)
#choice2<-c(1,0,0,0,1,0,0,0,1)
#newdata2<-as.data.frame(cbind(case2, variable2,value2,choice2))

  case2 variable2 value2 choice2
1     1        dv      1       1
2     1        dv      2       0
3     1        dv      3       0
4     2        dv      1       0
5     2        dv      2       1
6     2        dv      3       0
7     3        dv      1       0
8     3        dv      2       0
9     3        dv      3       1

Есть ли у вас какие-либо предложения для кода, который делает это, чтобы мне не пришлось кодировать переменную выбора вручную? Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Вероятно, этого можно добиться с помощью длинного формата данных, используя complete и fill.

library(dplyr)
library(tidyr)

df %>%
  mutate(choice = 1) %>%
  complete(IssueID, value = seq(min(value), max(value)), 
           fill = list(choice = 0)) %>%
  fill(variable)


#  IssueID value variable choice
#    <int> <int> <fct>     <dbl>
#1       1     1 dv            1
#2       1     2 dv            0
#3       1     3 dv            0
#4       2     1 dv            0
#5       2     2 dv            1
#6       2     3 dv            0
#7       3     1 dv            0
#8       3     2 dv            0
#9       3     3 dv            1

данные

df <- structure(list(IssueID = 1:3, variable = structure(c(1L, 1L, 
1L), .Label = "dv", class = "factor"), value = 1:3),
class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 30 марта 2020

Вы можете использовать пакет data.table следующим образом:

library(data.table)
setDT(df, key = c("IssueID", "value"))

df2 <- df[CJ(1:3, 1:3), .(IssueID, variable = "dv", value, choice = +!is.na(variable))]

df2
#        IssueID variable value choice
#     1:       1       dv     1      1
#     2:       1       dv     2      0
#     3:       1       dv     3      0
#     4:       2       dv     1      0
#     5:       2       dv     2      1
#     6:       2       dv     3      0
#     7:       3       dv     1      0
#     8:       3       dv     2      0
#     9:       3       dv     3      1

data

df <- structure(list(IssueID = 1:3, variable = structure(c(1L, 1L, 
1L), .Label = "dv", class = "factor"), value = 1:3),
class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 30 марта 2020

Вы можете создать фрейм данных со всеми перестановками case и dv, используя expand.grid. Затем match в столбцах paste d.

res <- transform(cbind(with(dat, expand.grid(case=case, dv=dv)), var="dv"), choice=0)
res$choice[match(Reduce(paste, dat), Reduce(paste, res[1:2]))] <- 1
res
#   case dv var choice
# 1    1  1  dv      1
# 2    2  1  dv      0
# 3    3  1  dv      0
# 4    1  2  dv      0
# 5    2  2  dv      1
# 6    3  2  dv      0
# 7    1  3  dv      0
# 8    2  3  dv      0
# 9    3  3  dv      1

Данные

dat <- data.frame(case=1:3, dv=1:3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...