использование lm () иrealt () внутри data.table - PullRequest
0 голосов
/ 31 августа 2018

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

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

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

https://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] 
...