衡量商店装修对R中销售的影响

时间:2018-09-30 10:09:44

标签: r regression linear-regression

我有一个数据集,其中包含最近几年的商店销售情况以及最近一次翻新商店的年份。我的目标是评估装修对重新开业后的销售是否有影响,以及这种影响在重新开业后的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。

我要去哪里错了?

谢谢! 斯特凡诺

1 个答案:

答案 0 :(得分:0)

以下是您的R问题的答案。如果您对这是否是正确的建模策略有任何疑问,我将前往Cross Validated

有两个问题。首先,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$Yeardt$Years_since_rennovation剩下的观察结果,我们会看到perfect multicollinearity

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函数的名称。