我有一个数据集,其中包含最近几年的商店销售情况以及最近一次翻新商店的年份。我的目标是评估装修对重新开业后的销售是否有影响,以及这种影响在重新开业后的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。
我要去哪里错了?
谢谢! 斯特凡诺
答案 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$Year
和dt$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函数的名称。