我一直在使用R的 " plm "包来进行面板数据的分析.在这个包中用于在"固定效应"或"随机效应"模型之间进行选择的重要测试之一称为Hausman类型.Stata也可以进行类似的测试.这里的要点是Stata要求首先估计固定效应,然后是随机效应.但是,我没有在"plm"包中看到任何这样的限制.所以,我想知道" plm "包是否首先具有默认的"固定效果",然后是"随机效应"第二.供您参考,我在下面提到了Stata和R中我为分析所遵循的步骤.
*
Stata Steps: (data=mydata, y=dependent variable,X1:X4: explanatory variables)
*step 1 : Estimate the FE model
xtreg y X1 X2 X3 X4 ,fe
*step 2: store the estimator
est store fixed
*step 3 : Estimate the RE model
xtreg y X1 X2 X3 X4,re
* step 4: store the estimator
est store random
*step 5: run Hausman test
hausman fixed random
#R steps (data=mydata, y=dependent variable,X1:X4: explanatory variables)
#step 1 …Run Code Online (Sandbox Code Playgroud) 我正在使用 plm 处理固定效应回归模型。
该模型如下所示:
FE.model <-plm(fml, data = data.reg2,
index=c('Site.ID','date.hour'), # cross section ID and time series ID
model='within', #coefficients are fixed
effect='individual')
summary(FE.model)
Run Code Online (Sandbox Code Playgroud)
“fml”是我之前定义的公式。我有很多自变量,所以这使它更有效率。
我想要做的是获取我的拟合值(我的 yhats)并将它们加入我的基础数据集;数据.reg2
我能够使用以下代码获得拟合值:
Fe.model.fitted <- FE.model$model[[1]] - FE.model$residuals
Run Code Online (Sandbox Code Playgroud)
但是,这只给了我一个拟合值的一列向量 - 我无法将它加入我的基本数据集。
或者,我尝试过这样的事情:
Fe.model.fitted <- cbind(data.reg2, resid=resid(FE.model), fitted=fitted(FE.model))
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
Error in as.data.frame.default(x[[i]], optional = TRUE) : cannot coerce class ""pseries"" to a data.frame
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以在我的基础数据集中获取我的拟合值吗?或者有人可以解释我遇到的错误,也许是一种解决方法?
我应该注意,我不想根据我的 beta 手动计算 yhat。对于该选项,我有太多的自变量,并且我定义的公式 (fml) 可能会更改,因此该选项将无效。
非常感谢!!
我想进行仅包括时间和单个固定影响(即没有其他右侧变量)的回归。
我尝试这样做plm:
plm(y ~ -1,data=data, effect="twoways", model="within")
Run Code Online (Sandbox Code Playgroud)
但是,语法不正确,-1仅从模型公式中抑制也不起作用。
错误消息是: Error in uniqval[as.character(effect), , drop = F] :
incorrect number of dimensions
使用plm进行y仅时间回归和固定效应回归的正确语法是什么?
谢谢!
我在固定效应模型上在线找到了这些示例代码:
代码1
fixed.time <- plm(y ~ x1 + factor(year), data=Panel, index=c("country", "year"), model="within")
Run Code Online (Sandbox Code Playgroud)
代码2
fixed.time <- plm(y ~ x1, data=Panel, index=c("country", "year"), model="within")
Run Code Online (Sandbox Code Playgroud)
有什么不同?与国家、年份建立索引是否意味着固定效应模型实际上为年份创建了虚拟变量?文档对此没有解释得很清楚。
我第一次尝试在 R 中使用 plm 包。
我希望估计一个只有时间虚拟变量的池模型,即没有未观察到的异质性。
我运行了一个简单的回归形式:
plm(dep ~ x:y -1, data=data, index=c("panel_var", "time_var"), effect="time", model="pooling")
Run Code Online (Sandbox Code Playgroud)
,其中 x 是连续变量,ya 是分类变量(因此 x:y 是交互作用)。鉴于我希望有时间虚拟对象,我-1在模型中添加了不包含截距的内容。
使用时summary,模型正确地告知我“面板”和“时间”维度的时间大小。但是,它不报告时间虚拟值。通过检查,我发现这是因为它在回归中不包括时间虚拟(运行lm没有截距的简单回归给出相同的答案)。
鉴于该effect="time"选项不会添加时间虚拟对象,它有什么作用?
我知道我想要的模型可以运行,lm但我想明确说明面板结构并使用vcovSCCplm 包中包含的协方差结构(尽管这在运行lm回归后也可能是可行的)。
感谢帮助!
我多次尝试使用 lm 和 plm 进行回归。我得到了不同的结果。
\n\n首先,我使用 lm 如下:
\n\nfixed.Region1 <- lm(CapNormChange ~ Policychanges + factor(Region), \n data=Panel)\nRun Code Online (Sandbox Code Playgroud)\n\n此外,我按以下方式使用 plm:
\n\nfixed.Region2 <- plm(CapNormChange ~ Policychanges+ factor(Region), \n data=Panel, index=c("Region", "Year"), model="within", effect="individual")\nRun Code Online (Sandbox Code Playgroud)\n\n我认为 plm 有问题,因为我在结果中没有看到拦截(见下文)。\n此外,我不完全确定是否+ factor (Region)有必要,但是,如果它不存在,我就看不到虚拟变量的系数(和显着性)。
所以,我的问题是:
\n\n如果有人能给我提示,我将非常感激。
\n\nLM 的结果:
\n\nCall:\nlm(formula = CapNormChange ~ Policychanges + factor(Region), \n data = Panel)\n\nResiduals:\n Min 1Q Median 3Q Max \n-31.141 -4.856 -0.642 1.262 192.803 \n\nCoefficients:\n Estimate …Run Code Online (Sandbox Code Playgroud) 我想创建变量的滞后。在面板数据设置中,显然仅在每个面板内考虑滞后。
为什么它plm不lag()尊重面板结构(默认情况下)并且有没有办法改变它(无需手动 dplyr )?
# Load example data
data("EmplUK", package = "plm")
Em <- pdata.frame(EmplUK, index=c('firm', 'year'))
# how I think it should have worked
Em$lwage_incorrect = lag(Em$wage)
# what actually works
Em= Em %>% group_by(firm) %>% mutate(lwage_correct = lag(wage))
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 plm 包运行固定效应回归。回归代码如下:
fixed = plm(hp~crime,index=c('year','country'),data=data,model='within')
Run Code Online (Sandbox Code Playgroud)
它返回以下错误代码:
pdim.default(index[[1]], index[[2]]) 中的错误:重复对(id-time)
我在网上搜索过,包括stackoverflow。我的理解是,plm 只能使用两个 ID 运行,因此,如果您有多个 ID,您将如何通过在索引之前合并这些 ID 来“欺骗”plm。 但是,我的数据仅包含以下列:国家、年份、生命值和犯罪,所以我不明白这是怎么可能的。
本质上我要问的是,我做错了什么吗?我是否仍然需要合并这两个 ID,或者是我的行重复项中有问题,如果是这种情况,是否可以通过编码找到重复项?(我手动尝试查看我的面板数据以查找 ID 的重复项,即国家 1 第 1 年房价的几个值。
如果我跑
any(table(data$country,data$year)!=1)
Run Code Online (Sandbox Code Playgroud)
我明白了。据我所知,这表明国家+年份组合没有任何重复。
正如标题所说。我加载后pglm,lag停止正常工作。
library(pglm)
c(1,2,3,4) %>% lag()
Run Code Online (Sandbox Code Playgroud)
该对象被转换为时间序列,并且不再与 tibbles 兼容。
即使卸载pglm, 的依赖lag仍然有效。
一个解决方案可能是实际上从不加载pglm,但是如果我lag(x)在公式中有一个
pglm:pglm(
family= poisson,
y ~ lag(x),
model = "within", index="id",
data = db
)
Run Code Online (Sandbox Code Playgroud)
该算法无法收敛到估计值。由于某些原因,甚至强迫发生这种情况stats::lag(x)。有趣的是,相反,如果pglm已加载,则y ~ lag(x)可以正常工作y ~ stats:lag(x)。
这是唯一有效的情况,呵呵!我唯一想到的另一件事是外部公式dplyr::lag是冲突的罪魁祸首。
我不知道如何优化工作流程,您有建议吗?
如何使用plm对象制作LaTeX表?
我一直在使用apsrtable为lm对象制作输出摘要的LaTeX表,但似乎找不到用plm做同样的简单方法.我正在使用plm和VcovBK()计算面板校正的标准误差,但随后必须进入乳胶并手动更改标准误差.