используя lm() и предсказать() внутри data.table

Моя цель - #1 предсказать продажи 15-го и 16-го числа по ItemNumber и сохранить, используя приведенные ниже данные. # 2 показать этот прогноз в виде столбца в этих данных или его подмножестве, чтобы я мог просмотреть строку и увидеть переменные-предикторы рядом с прогнозом для каждого дня.

Data.table — это то, что мне больше всего нравится. Я хотел бы использовать его для достижения своих целей, если это возможно.

Ниже DT представляет собой таблицу исторических продаж двух товаров в двух розничных магазинах и переменных, которые влияли на эти продажи до 14 июля. В DT включены два «будущих дня» 15 и 16 июля, а также некоторые известные переменные, которые повлияют на продажи в эти дни.

http://stackoverflow.com/questions/23947245/use-predict-on-data-table-with-linear-regression

Используя приведенный выше пост среди других и совет пользователя 42, я могу перейти к следующей строке. D1 — это исторические UnitSales, а D2 — будущие дни, для которых я хочу предсказать UnitSales.

resultsofpredict=D1[,predict.lm(lm(UnitSales~.,.SD,na.action = na.exclude),D2[.BY]),by=c("ItemNumber","Store"),.SDcols=testcols]

Теперь, как мне правильно объединить или объединить результаты прогноза с D2, чтобы я мог видеть прогноз, дату и все переменные прогноза вместе в одной строке — прогноз V1 как столбец D2? Вот попытки, которые не работают и заканчиваются 16 строками, когда я хотел только 8. Может ли кто-нибудь опубликовать пример, используя мои данные, чтобы я мог визуализировать его, поскольку я новичок в этом?

combinedresult=merge(D2,resultsofpredict )

combinedresult=merge(resultsofpredict,D2)

Спасибо.

library(data.table)
library(lubridate)

zz="
Store   Date    ItemNumber  RetailPrice Backstock   UnitSales   typea   typeb   typec   Sunday  Monday  Tuesday Wednesday   Friday  Saturday
1   7/8/2018    500 1.2 5   20  0   1   0   1   0   0   0   0   0
1   7/9/2018    500 1.2 9   10  0   1   0   0   1   0   0   0   0
1   7/10/2018   500 0.8 0   10  1   0   0   0   0   1   0   0   0
1   7/11/2018   500 0.8 0   8   1   0   0   0   0   0   1   0   0
1   7/12/2018   500 0.8 0   7   1   0   0   0   0   0   0   0   0
1   7/13/2018   500 1.2 3   18  0   1   0   0   0   0   0   1   0
1   7/14/2018   500 1.2 0   21  0   1   0   0   0   0   0   0   1
1   7/15/2018   500 1.2 3   99  0   1   0   1   0   0   0   0   0
1   7/16/2018   500 0.8 0   99  1   0   0   0   1   0   0   0   0
1   7/8/2018    600 1.2 0   18  0   1   0   1   0   0   0   0   0
1   7/9/2018    600 1.2 0   11  0   1   0   0   1   0   0   0   0
1   7/10/2018   600 0.8 0   12  1   0   0   0   0   1   0   0   0
1   7/11/2018   600 0.8 0   4   1   0   0   0   0   0   1   0   0
1   7/12/2018   600 0.8 0   5   1   0   0   0   0   0   0   0   0
1   7/13/2018   600 1.2 0   13  0   1   0   0   0   0   0   1   0
1   7/14/2018   600 1.2 0   29  0   1   0   0   0   0   0   0   1
1   7/15/2018   600 1.2 2   99  0   1   0   1   0   0   0   0   0
1   7/16/2018   600 0.8 0   99  1   0   0   0   1   0   0   0   0
2   7/8/2018    500 1.2 0   10  0   1   0   1   0   0   0   0   0
2   7/9/2018    500 1.2 0   6   0   1   0   0   1   0   0   0   0
2   7/10/2018   500 0.8 0   5   1   0   0   0   0   1   0   0   0
2   7/11/2018   500 0.8 0   5   1   0   0   0   0   0   1   0   0
2   7/12/2018   500 0.8 3   5   1   0   0   0   0   0   0   0   0
2   7/13/2018   500 1.2 3   12  0   1   0   0   0   0   0   1   0
2   7/14/2018   500 1.2 9   14  0   1   0   0   0   0   0   0   1
2   7/15/2018   500 1.2 3   99  0   1   0   1   0   0   0   0   0
2   7/16/2018   500 0.8 0   99  1   0   0   0   1   0   0   0   0
2   7/8/2018    600 1.2 0   14  0   1   0   1   0   0   0   0   0
2   7/9/2018    600 1.2 0   11  0   1   0   0   1   0   0   0   0
2   7/10/2018   600 0.8 0   7   1   0   0   0   0   1   0   0   0
2   7/11/2018   600 0.8 0   3   1   0   0   0   0   0   1   0   0
2   7/12/2018   600 0.8 0   5   1   0   0   0   0   0   0   0   0
2   7/13/2018   600 1.2 0   12  0   1   0   0   0   0   0   1   0
2   7/14/2018   600 1.2 0   17  0   1   0   0   0   0   0   0   1
2   7/15/2018   600 1.2 0   99  0   1   0   1   0   0   0   0   0
2   7/16/2018   600 0.8 0   99  1   0   0   0   1   0   0   0   0
"

загрузить и подготовить данные

DT=as.data.table(read.table(text=zz,fill=TRUE,header=TRUE))
setkey(DT,ItemNumber,Store)  

Я использовал 99 только в качестве заполнителя в таблице для загрузки примера. Убираем здесь.

DT[UnitSales==99,UnitSales:=(value=NA_integer_)]
DT = DT[, Date:=  as.Date(Date, "%m/%d/%Y")]

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

testcols=c('RetailPrice','Saturday','Sunday','Tuesday')  

Разделение DT на историю и новые данные

d="07/14/2018"
d=as.Date(d,"%m/%d/%Y")

Исторические продажи

D1=DT[Date < d+1]

«Будущие» дни для прогнозирования UnitSales для

D2=DT[Date> d]

таблица с коэффициентами из D1

coeftable=D1[ , as.list(coef(lm(UnitSales~.,.SD,na.action = NULL))) , 
               by= c("ItemNumber","Store"),.SDcols=testcols] 

person Chad    schedule 30.08.2018    source источник
comment
Сообщение об ошибке кажется довольно ясным. У вас есть два по аргументам.   -  person IRTFM    schedule 31.08.2018
comment
спасибо 42. Я сделал правку.   -  person Chad    schedule 31.08.2018