Измерьте влияние обновления магазина на продажи в R - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть набор данных, который содержит информацию о продажах магазинов за последние годы, а также год, когда магазин был отремонтирован последним.Моя цель состоит в том, чтобы измерить, повлияло ли обновление на продажи после повторного открытия, и как это влияние развивалось в течение 4 лет после открытия.

Моя задача состоит в том, чтобы общая тенденция в наборе данных показалачто все магазины теряют около 2% в год выручки.Поэтому мне необходимо учитывать это и при измерении моего эффекта.

Моя первоначальная идея заключалась в создании манекенов для каждого возможного года обновления, но это не сработает, учитывая, что я собираю данные только для 35 магазинов.Поэтому я попытался создать переменную, подсчитывающую количество лет после обновления, но мне не хватает чего-то, что я думаю:

library(data.table)
year_start = 2013
year_stop = 2017
n_years = year_stop - year_start+1

seed_sales = 100
year_decrease = 0.02

n_shops = 35
shops = paste0("Shop",seq(1,n_shops))

dt_sales <- data.table( Shop = sort(rep(shops, n_years)),
                     Year = rep(seq(year_start,year_stop), length(shops)),
                     Year_Renovation = round(rbinom(n_shops*n_years,1,0.3)*runif(1, year_start-10, year_stop))
                     )

dt_sales[, Sales := 100-(Year-year_start)*year_decrease*rnorm(n_shops*n_years,1)-ifelse(Year_Renovation==1,ifelse(Year-Year_Renovation<2,10,0)*rnorm(n_shops*n_years)+ifelse(Year-Year_Renovation>2,10*Year-Year_Renovation,0)*rnorm(n_shops*n_years),0)]

## Current thinking
dt_sales[, Is_renovated := ifelse(Year_Renovation == 0,0,1)]
dt_sales[Is_renovated==1 & Year-Year_Renovation>=0, Years_since_rennovation := Year-Year_Renovation]

lm = glm(Sales ~ Year + Is_renovated:Years_since_rennovation, data=dt_sales,family = gaussian(),na.action = na.omit)
summary(lm)

Вывод:

(Intercept)             137.855325   9.679754  14.242  < 2e-16 *** 
Year                     -0.018807   0.004803  -3.915 0.000279 ***
Years_since_rennovation         NA         NA      NA       NA    

Годовое снижение зафиксировано, но эффект обновления, по-видимому, включен в перехват, который, как я установил, достигает 137 вместо 100.

Где я иду не так?

Спасибо!Stefano

1 Ответ

0 голосов
/ 30 сентября 2018

Далее следует ответ на ваш вопрос R.Если у вас есть какие-либо вопросы о том, является ли это правильной стратегией моделирования, я бы обратился к Перекрестная проверка .

Есть две проблемы.Во-первых, dt_sales$Years_since_rennovation - это почти все NA:

dt_sales$Years_since_rennovation

  [1] NA NA NA NA  2 NA NA NA  1  2 NA NA NA  1  2 NA NA NA  1 NA NA NA  0  1 NA
 [26] NA NA  0 NA NA NA NA NA NA NA NA NA  0 NA NA NA NA NA  1 NA NA NA  0  1 NA
 [51] NA NA NA NA NA NA NA NA NA NA NA NA  0  1 NA NA NA NA NA NA NA NA  0 NA NA
 [76] NA NA NA  1 NA NA NA NA  1 NA NA NA  0  1  2 NA NA  0 NA NA NA NA NA NA NA
[101] NA NA  0  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  1 NA
[126] NA NA NA  1  2 NA NA NA NA NA NA NA  0 NA NA NA NA NA NA NA NA NA  0 NA  2
[151] NA NA NA NA NA NA NA NA NA NA NA NA  0 NA NA NA NA NA NA NA NA NA NA NA NA

Следовательно, вы видите в выводе summary()

  (144 observations deleted due to missingness)

Затем, если мы рассмотрим dt$Year и dt$Years_since_rennovation для остальных наблюдений мы видим, что есть совершенная мультиколлинеарность :

dt_sales$Year[!is.na(dt_sales$Years_since_rennovation)] - 2015
# [1] 2 1 2 1 2 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 2 0 0 1 1 1 2 0 0 2 0
dt_sales$Years_since_rennovation[!is.na(dt_sales$Years_since_rennovation)]
# [1] 2 1 2 1 2 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 2 0 0 1 1 1 2 0 0 2 0

Это делает невозможным для R оценку обоих коэффициентов.Таким образом, R оценивает первый коэффициент и опускает вторую переменную.Если вы не хотите, чтобы R делал это без выдачи ошибки, передайте singular.ok = FALSE (см. help("glm")):

lm = glm(Sales ~ Year + Is_renovated:Years_since_rennovation, data=dt_sales,
         family = gaussian(), na.action = na.omit, singular.ok = FALSE)

Error in glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  : 
  singular fit encountered

В качестве примечания, я бы не стал называть объекты lm какэто также название основной функции OLS.

...