Передача вектора из столбца данных, хранящегося в списке, в glm - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь подогнать модель регрессии Пуассона к набору данных в R, в результате чего у меня есть векторы различной длины, хранящиеся в двух списках в виде столбцов данных, например:

test <- data.frame(a = 1:10, b = rnorm(10))
test$c <- list(length = nrow(test))
test$d <- list(length = nrow(test))

for(i in 1:nrow(test)) {

  test$c[[i]] <- LETTERS[1:sample(10:11, 1)]
  test$d[[i]] <- LETTERS[1:sample(10:11, 1)]
}

Мне нужно построить модель для прогнозирования a из b и векторов c и d. Поскольку невозможно передать списки в glm, я попытался распечатать списки c и d, чтобы передать их в модель, но это просто приводит к созданию одного длинного вектора для c и d, что означает I получить эту ошибку:

m0.glm <- glm(a ~ b + unlist(c) + unlist(d), data = test)

Error in model.frame.default(formula = a ~ b + unlist(c) + unlist(d),  : 
  variable lengths differ (found for 'unlist(c)')

Я чувствую, что будет простое решение, которое мне не хватает в моей проблеме, но мне раньше не приходилось пытаться передать список векторов модели.

Заранее спасибо.

1 Ответ

1 голос
/ 11 июля 2019

Если проблема заключается в создании df из списков, то:

test <- data.frame(a = 1:10, b = rnorm(10))
test$c <- list(length(nrow(test)))
test$d <- list(length(nrow(test)))

for(i in 1:nrow(test)) {

  test$c[[i]] <- LETTERS[1:sample(10:11, 1)]
  test$d[[i]] <- LETTERS[1:sample(10:11, 1)]
}

# 
do.call(rbind, lapply(test$c, function(x) {
  res <- rep(NA, max(vapply(test$c, length, integer(1))))
  res[1:length(x)] <- x
  res
})) -> test_c_df


do.call(rbind, lapply(test$d, function(x) {
  res <- rep(NA, max(vapply(test$d, length, integer(1))))
  res[1:length(x)] <- x
  res
})) -> test_d_df

test_new <- cbind(test[c("a", "b")], test_c_df, test_d_df)
names(test_new) <- make.unique(names(test_new))

m0.glm <- glm(a ~ ., data = test_new) # data reasonable??
...