2 向 FE 模型在 R 中给出 "empty model"
2-way FE model gives "empty model" in R
我正在尝试使用 plm 运行 R 中的 2 向固定效应模型。我正在尝试了解某个事件对市政当局公投投票的处理效果。
我想要 运行 具有市政和公投固定效应的模型。
每行或单位是一对市政*公投。
我正在尝试使用以下方法拟合模型:
model_2fe <- plm(vote.ant.immig ~ pre.post, data = clean.df, effect = "twoways", index = c("municipality.code", "ref.code"))
我不断收到以下信息:
Error in plm.fit(data, model, effect, random.method, random.models, random.dfcor, : empty model
如果有帮助:pre.post是一个表示处理条件(1,0)的因子,vote.ant.immig是一个数值对象,municipality.code是一个因子,[=28]也是=].
有人能帮帮我吗?
谢谢!
使用?plm::detect.lindep
中的提示,你可以看到经过双向固定效应变换后的数据是什么样子的。这里有一些代码行可以帮助您:
dat <- pdata.frame(<inputdata>, index = c("municipalitycode", "refcode"))
fml <- voteantimmig ~ prepost
mf <- model.frame(dat, fml)
modmat_2FE <- model.matrix(mf, model = "within", effect = "twoways")
all(abs(modmat_2FE) < 0.0000000000001) # TRUE
## look at your transformed data in modmat_2FE -> all zero -> empty model
## Analyse why this is the case, per individual, per time period:
modmat_FEi <- model.matrix(mf, model = "within", effect = "individual")
all(abs(modmat_FEi) < 0.0000000000001) # FALSE
## look at your transformed data in modmat_FEi
unique(modmat_FEi) # not so many different values
## look at your transformed data in modmat_FEi with individual and time index next to it:
modmat_FEiindexes <- cbind(modmat_FEi, dat$municipalitycode, dat$refcode)
## => not much variation left within each individual.
modmat_FEt <- model.matrix(mf, model = "within", effect = "time")
all(abs(modmat_FEt) < 0.0000000000001) # TRUE
## look at your transformed data in modmat_FEt -> all zero
完成@Helix123 上面讨论的另一种方法是为自治市 x 公投固定效应创建一个新的虚拟变量。
clean.df$muni_x_ref <- factor(paste(clean.df$municipality, clean.df$refcode, sep='X'))
然后您可以使用新的 muni_x_ref
变量对 prepost 进行制表。下面的前几行。您会看到对于每个市政当局 x 公投固定效应,您只有一个自变量实现。您的 fe 和自变量完全共线,并且没有变化来估计您的模型。我相信您需要重新考虑要估计的内容。
table(clean.df$muni_x_refcode, df$prepost)
0 1
AdlikonX5240 1 0
AdlikonX5250 1 0
AdlikonX5320 1 0
AdlikonX5470 1 0
AdlikonX5521 1 0
AdlikonX5522 1 0
AdlikonX5710 1 0
AdlikonX5800 0 1
AdlikonX5880 0 1
AdlikonX5970 0 1
AdlikonX6040 0 1
AdlikonX6090 0 1
Aeugst am AlbisX5240 1 0
Aeugst am AlbisX5250 1 0
Aeugst am AlbisX5320 1 0
Aeugst am AlbisX5470 1 0
Aeugst am AlbisX5521 1 0
Aeugst am AlbisX5522 1 0
Aeugst am AlbisX5710 1 0
Aeugst am AlbisX5800 0 1
Aeugst am AlbisX5880 0 1
Aeugst am AlbisX5970 0 1
Aeugst am AlbisX6040 0 1
Aeugst am AlbisX6090 0 1
Affoltern am AlbisX5240 1 0
Affoltern am AlbisX5250 1 0
Affoltern am AlbisX5320 1 0
Affoltern am AlbisX5470 1 0
Affoltern am AlbisX5521 1 0
Affoltern am AlbisX5522 1 0
Affoltern am AlbisX5710 1 0 ....
我发现这个 post 很有用,所以我会尽我所能提供信息,但它实际上是小插图的摘要,应该指导任何使用 plm 的人。请注意,您没有在 plm() 中包含为模型提供的输入,这显然是有问题的。
鉴于(如您所写),
#note, no model input for plm()
model_2fe <- plm(vote.ant.immig ~ pre.post,
data = clean.df,
effect = "twoways",
index = c("municipality.code", "ref.code"))
我们应该逐步进行,并确保我们符合 plm() 的 'p...' 的必要格式:
pform <- pFormula(vote.ant.immig ~ pre.post)
#then make the pdata.frame
pclean.df <- pdata.frame(clean.df,index = c("municipalitycode", "refcode"))
#then make the df with necessary variables for/from pform (the formula)
pmf.clean.df <- model.frame(pclean.df,pform)
#then make the design/model matrix "e.g., by expanding factors to a set of dummy variables (depending on the contrasts) and expanding interactions similarly" (quote from ?model.matrix).
pmodmat.fe <- model.matrix(pform,data=pmf.clean.df, model = "within",effect = "twoways")
#then check for linear dependence
detect.lindep(pmodmat.fe)
#lastly, run the regression with fixed effects
mod.fe <- plm(pform,
data=pclean.df,
model="within",
effects="twoways")
对我来说,当我在个人应用程序中使用它时,在 pdata.frame 中建立索引很有用,因为我可以节省很多时间。
我正在尝试使用 plm 运行 R 中的 2 向固定效应模型。我正在尝试了解某个事件对市政当局公投投票的处理效果。
我想要 运行 具有市政和公投固定效应的模型。 每行或单位是一对市政*公投。
我正在尝试使用以下方法拟合模型:
model_2fe <- plm(vote.ant.immig ~ pre.post, data = clean.df, effect = "twoways", index = c("municipality.code", "ref.code"))
我不断收到以下信息:
Error in plm.fit(data, model, effect, random.method, random.models, random.dfcor, : empty model
如果有帮助:pre.post是一个表示处理条件(1,0)的因子,vote.ant.immig是一个数值对象,municipality.code是一个因子,[=28]也是=].
有人能帮帮我吗? 谢谢!
使用?plm::detect.lindep
中的提示,你可以看到经过双向固定效应变换后的数据是什么样子的。这里有一些代码行可以帮助您:
dat <- pdata.frame(<inputdata>, index = c("municipalitycode", "refcode"))
fml <- voteantimmig ~ prepost
mf <- model.frame(dat, fml)
modmat_2FE <- model.matrix(mf, model = "within", effect = "twoways")
all(abs(modmat_2FE) < 0.0000000000001) # TRUE
## look at your transformed data in modmat_2FE -> all zero -> empty model
## Analyse why this is the case, per individual, per time period:
modmat_FEi <- model.matrix(mf, model = "within", effect = "individual")
all(abs(modmat_FEi) < 0.0000000000001) # FALSE
## look at your transformed data in modmat_FEi
unique(modmat_FEi) # not so many different values
## look at your transformed data in modmat_FEi with individual and time index next to it:
modmat_FEiindexes <- cbind(modmat_FEi, dat$municipalitycode, dat$refcode)
## => not much variation left within each individual.
modmat_FEt <- model.matrix(mf, model = "within", effect = "time")
all(abs(modmat_FEt) < 0.0000000000001) # TRUE
## look at your transformed data in modmat_FEt -> all zero
完成@Helix123 上面讨论的另一种方法是为自治市 x 公投固定效应创建一个新的虚拟变量。
clean.df$muni_x_ref <- factor(paste(clean.df$municipality, clean.df$refcode, sep='X'))
然后您可以使用新的 muni_x_ref
变量对 prepost 进行制表。下面的前几行。您会看到对于每个市政当局 x 公投固定效应,您只有一个自变量实现。您的 fe 和自变量完全共线,并且没有变化来估计您的模型。我相信您需要重新考虑要估计的内容。
table(clean.df$muni_x_refcode, df$prepost)
0 1
AdlikonX5240 1 0
AdlikonX5250 1 0
AdlikonX5320 1 0
AdlikonX5470 1 0
AdlikonX5521 1 0
AdlikonX5522 1 0
AdlikonX5710 1 0
AdlikonX5800 0 1
AdlikonX5880 0 1
AdlikonX5970 0 1
AdlikonX6040 0 1
AdlikonX6090 0 1
Aeugst am AlbisX5240 1 0
Aeugst am AlbisX5250 1 0
Aeugst am AlbisX5320 1 0
Aeugst am AlbisX5470 1 0
Aeugst am AlbisX5521 1 0
Aeugst am AlbisX5522 1 0
Aeugst am AlbisX5710 1 0
Aeugst am AlbisX5800 0 1
Aeugst am AlbisX5880 0 1
Aeugst am AlbisX5970 0 1
Aeugst am AlbisX6040 0 1
Aeugst am AlbisX6090 0 1
Affoltern am AlbisX5240 1 0
Affoltern am AlbisX5250 1 0
Affoltern am AlbisX5320 1 0
Affoltern am AlbisX5470 1 0
Affoltern am AlbisX5521 1 0
Affoltern am AlbisX5522 1 0
Affoltern am AlbisX5710 1 0 ....
我发现这个 post 很有用,所以我会尽我所能提供信息,但它实际上是小插图的摘要,应该指导任何使用 plm 的人。请注意,您没有在 plm() 中包含为模型提供的输入,这显然是有问题的。
鉴于(如您所写),
#note, no model input for plm()
model_2fe <- plm(vote.ant.immig ~ pre.post,
data = clean.df,
effect = "twoways",
index = c("municipality.code", "ref.code"))
我们应该逐步进行,并确保我们符合 plm() 的 'p...' 的必要格式:
pform <- pFormula(vote.ant.immig ~ pre.post)
#then make the pdata.frame
pclean.df <- pdata.frame(clean.df,index = c("municipalitycode", "refcode"))
#then make the df with necessary variables for/from pform (the formula)
pmf.clean.df <- model.frame(pclean.df,pform)
#then make the design/model matrix "e.g., by expanding factors to a set of dummy variables (depending on the contrasts) and expanding interactions similarly" (quote from ?model.matrix).
pmodmat.fe <- model.matrix(pform,data=pmf.clean.df, model = "within",effect = "twoways")
#then check for linear dependence
detect.lindep(pmodmat.fe)
#lastly, run the regression with fixed effects
mod.fe <- plm(pform,
data=pclean.df,
model="within",
effects="twoways")
对我来说,当我在个人应用程序中使用它时,在 pdata.frame 中建立索引很有用,因为我可以节省很多时间。