Выполните итерацию по DataTable, чтобы построить модель для каждого идентификатора - PullRequest
1 голос
/ 30 марта 2019

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

ID   Weeks  V1   V2   Sales
1      1    100  200    30
1      2    100  210    40
1      3    102  240    50
2      1    120  220    35
3      1    110  202    51
...

Моя цель - прогнозировать продажи на 9 неделе для каждого идентификатора. Большинство идентификаторов заполнены значениями от 1 до 8 недели, другие имеют только одно значение. Это в основном то, что я хочу для каждого идентификатора, а не только для идентификатора 26:

train_ID26 = train[ID==26,]
test_ID26 = test[ID==26,]
model_ID26 = glm(Sales~ V1+V2,data = train_ID26)
test_ID26[,pred:= predict(model_ID26, newdata=test_ID26, type="response")]

Я думаю, что это можно сделать с помощью цикла for, но, к сожалению, я не знаком с циклом R и не смог придумать, как его создать. Я также читал, что петли часто не являются предпочтительным выбором в R.

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

Рассмотрим split как для обучающих, так и для тестовых наборов данных, затем вызовите свой прогноз с помощью Map (обертка для mapply) для поэлементной итерации.Ниже предполагается, что в обеих таблицах данных содержится одинаковое количество уникальных идентификаторов.

# LIST OF DATA TABLES
train_list = data.table::split(train, by="ID")
test_list = data.table::split(test, by="ID")

# GENERALIZED PREDICTION FUNCTION
proc_model <- function(test_ID, train_ID) {
   model_ID <- glm(Sales~ V1+V2, data=train_ID)
   test_ID[,pred:= predict(model_ID, newdata=test_ID, type="response")]
}

# LIST OF PREDICTED DATA TABLES
pred_list <- Map(proc_model, train_list, test_list)
0 голосов
/ 30 марта 2019

Если вы не боитесь решения for loop:

train_ID<- list()
test_ID <- list()
model_Id <- list()
for(id in train$ID){
  train_ID[[paste0("ID",id)]]=train[ID==id,]
  test_ID[[paste0("ID",id)]]=test[ID==id,]
  model_ID[[paste0("ID",id)]] = glm(Sales~ V1+V2,data = train_ID[[paste0("ID",id)]])
  test_ID[[paste0("ID",id)]]=test_id[[paste0("ID",id)]][,pred:= predict(model_ID[[paste0("ID",id)]], newdata= test_ID[[paste0("ID",id)]], type="response")]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...