我有一个数据表,看起来像这样:
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
...我的目标是预测每个ID在第9周的销售额。大多数ID都是从第1周到第8周的值,其他的只有一个值。这基本上就是我想要的每个ID,而不仅仅是ID 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中的首选。
发布于 2019-03-31 00:56:13
考虑在训练和测试数据集上使用split,然后使用Map (包装器到mapply)调用您的预测进行元素级迭代。下面假设两个数据表中具有相同数量的唯一ID。
# 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)发布于 2019-03-30 23:41:22
如果您不怕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")]
}https://stackoverflow.com/questions/55432943
复制相似问题