首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用R计算面板数据中个体固定效应的预测概率(或平均边际效应)?

如何使用R计算面板数据中个体固定效应的预测概率(或平均边际效应)?
EN

Stack Overflow用户
提问于 2021-10-14 23:59:23
回答 3查看 503关注 0票数 8

这是三种不同的方式来运行一个单独的固定效果方法,它提供了或多或少相同的结果(见下文)。我的主要问题是如何使用第二个模型(model_plm)或第三个模型(model_felm)来获得预测概率或平均边际效应。我知道如何使用第一个模型(model_lm),并展示了下面使用ggeffects的一个示例,但只有当我有一个小的示例时,它才能工作。

由于我有超过一百万个人,我的模型只使用model_plmmodel_felm。如果我使用model_lm,与100万人一起运行需要很长时间,因为他们在模型中被控制。我还得到了以下错误:Error: vector memory exhausted (limit reached?)。为了解决这个错误,我在StackOverflow上检查了许多线程,但是似乎没有什么能解决这个问题。

我想知道是否有一个有效的方法来解决这个问题。我的主要兴趣是提取交互作用residence*union的预测概率。我通常使用这些软件包中的一个提取预测概率或平均边际效应:ggeffectsemmeansmargins

代码语言:javascript
运行
AI代码解释
复制
library(lfe)
library(plm)
library(ggeffects)
data("Males")  

model_lm = lm(wage ~ exper + residence+health + residence*union +factor(nr)-1, data=Males)
model_plm = plm(wage ~ exper + residence + health + residence*union,model = "within", index=c("nr", "year"), data=Males)
model_felm = felm(wage ~ exper + residence + health + residence*union | nr, data= Males)

pred_ggeffects <- ggpredict(model_lm, c("residence","union"), 
                    vcov.fun = "vcovCL", 
                    vcov.type = "HC1",
                    vcov.args = list(cluster = Males$nr))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-22 19:51:21

我试着调整公式/数据集,以获得get,plm发挥良好。如果这里有什么东西请告诉我。我意识到,在经过一些测试之后,这个大答案不会对一百万个人产生影响。

代码语言:javascript
运行
AI代码解释
复制
library(emmeans)
library(plm)
data("Males")  

## this runs but we need to get an equivalent result with expanded formula
## and expanded dataset
model_plm = plm(wage ~ exper + residence + health + residence*union,model = "within", index=c("nr"), data=Males)

## expanded dataset
Males2 <- data.frame(wage=Males[complete.cases(Males),"wage"],
                     model.matrix(wage ~ exper + residence + health + residence*union, Males), 
                     nr=Males[complete.cases(Males),"nr"])


(fmla2 <- as.formula(paste("wage ~ ", paste(names(coef(model_plm)), collapse= "+"))))

## expanded formula
model_plm2 <- plm(fmla2,
                  model = "within",
                  index=c("nr"), 
                  data=Males2)

(fmla2_rg <- as.formula(paste("wage ~ -1 +", paste(names(coef(model_plm)), collapse= "+"))))

plm2_rg <- qdrg(fmla2_rg,
                data = Males2,
                coef = coef(model_plm2),
                vcov = vcov(model_plm2),
                df = model_plm2$df.residual)

plm2_rg

### when all 3 residences are 0, that's `rural area`
### then just pick the rows when one of the residences are 1
emmeans(plm2_rg, c("residencenorth_east","residencenothern_central","residencesouth", "unionyes"))

这样,在删除行之后:

代码语言:javascript
运行
AI代码解释
复制
> ### when all 3 residences are 0, that's `rural area`
> ### then just pick the rows when one of the residences are 1
> emmeans(plm2_rg, c("residencenorth_east","residencenothern_central","residencesouth", "unionyes"))
 residencenorth_east residencenothern_central residencesouth unionyes emmean     SE   df lower.CL upper.CL
                   0                        0              0        0 0.3777 0.0335 2677  0.31201    0.443
                   1                        0              0        0 0.3301 0.1636 2677  0.00929    0.651
                   0                        1              0        0 0.1924 0.1483 2677 -0.09834    0.483
                   0                        0              1        0 0.2596 0.1514 2677 -0.03732    0.557
                   0                        0              0        1 0.2875 0.1473 2677 -0.00144    0.576
                   1                        0              0        1 0.3845 0.1647 2677  0.06155    0.708
                   0                        1              0        1 0.3326 0.1539 2677  0.03091    0.634
                   0                        0              1        1 0.3411 0.1534 2677  0.04024    0.642

Results are averaged over the levels of: healthyes 
Confidence level used: 0.95
票数 2
EN

Stack Overflow用户

发布于 2021-10-26 07:35:09

问题似乎是,当我们将-1添加到公式中时,就会在模型矩阵中创建一个额外的列,而该列不包含在回归系数中。(这是R创建因子编码方式的副产品。)所以我可以通过增加一个战略性的零的系数来解决这个问题。我们还必须以同样的方式修正协方差矩阵:

代码语言:javascript
运行
AI代码解释
复制
library(emmeans)
library(plm)
data("Males")

mod <- plm(wage ~ exper + residence + health + residence*union,
           model = "within", 
           index = "nr", 
           data = Males)

BB <- c(coef(mod)[1], 0, coef(mod)[-1])
k <- length(BB)
VV <- matrix(0, nrow = k, ncol = k)
VV[c(1, 3:k), c(1, 3:k)] <- vcov(mod)

RG <- qdrg(~ -1 + exper + residence + health + residence*union, 
           data = Males, coef = BB, vcov = VV, df = df.residual(mod))

验证事物是否排列一致:

代码语言:javascript
运行
AI代码解释
复制
> names(RG@bhat)
 [1] "exper"                             ""                                 
 [3] "residencenorth_east"               "residencenothern_central"         
 [5] "residencesouth"                    "healthyes"                        
 [7] "unionyes"                          "residencenorth_east:unionyes"     
 [9] "residencenothern_central:unionyes" "residencesouth:unionyes"
> colnames(RG@linfct)
 [1] "exper"                             "residencerural_area"              
 [3] "residencenorth_east"               "residencenothern_central"         
 [5] "residencesouth"                    "healthyes"                        
 [7] "unionyes"                          "residencenorth_east:unionyes"     
 [9] "residencenothern_central:unionyes" "residencesouth:unionyes"

他们会排好队,这样我们就能得到我们需要的结果:

代码语言:javascript
运行
AI代码解释
复制
(EMM <- emmeans(RG, ~ residence * union))
 residence       union emmean     SE   df lower.CL upper.CL
 rural_area      no     0.378 0.0335 2677  0.31201    0.443
 north_east      no     0.330 0.1636 2677  0.00929    0.651
 nothern_central no     0.192 0.1483 2677 -0.09834    0.483
 south           no     0.260 0.1514 2677 -0.03732    0.557
 rural_area      yes    0.287 0.1473 2677 -0.00144    0.576
 north_east      yes    0.385 0.1647 2677  0.06155    0.708
 nothern_central yes    0.333 0.1539 2677  0.03091    0.634
 south           yes    0.341 0.1534 2677  0.04024    0.642

Results are averaged over the levels of: health 
Confidence level used: 0.95 

通常,关键是确定添加的列发生在何处。它将是第一个因素在模型公式中的第一个水平的位置。您可以通过查看names(coef(mod))colnames(model.matrix(formula), data = data)来检查它,其中formula是删除截距的模型公式。

更新:一般功能

这里有一个函数,可用于为任何plm对象创建引用网格。事实证明,有时这些物体确实有拦截(例如,随机效应模型),所以我们必须检查。对于缺少拦截的模型,您确实应该只将其用于对比。

代码语言:javascript
运行
AI代码解释
复制
plmrg = function(object, ...) {
    form = formula(formula(object))
    if (!("(Intercept)" %in% names(coef(object))))
        form = update(form, ~ . - 1)
    data = eval(object$call$data, environment(form))
    mmat = model.matrix(form, data)
    sel = which(colnames(mmat) %in% names(coef(object)))
    k = ncol(mmat)
    b = rep(0, k)
    b[sel] = coef(object)
    v = matrix(0, nrow = k, ncol = k)
    v[sel, sel] = vcov(object)
    emmeans::qdrg(formula = form, data = data, 
        coef = b, vcov = v, df = df.residual(object), ...)
}

测试运行:

代码语言:javascript
运行
AI代码解释
复制
> (rg = plmrg(mod, at = list(exper = c(3,6,9))))
'emmGrid' object with variables:
    exper = 3, 6, 9
    residence = rural_area, north_east, nothern_central, south
    health = no, yes
    union = no, yes

> emmeans(rg, "residence")
NOTE: Results may be misleading due to involvement in interactions
 residence       emmean     SE   df lower.CL upper.CL
 rural_area       0.313 0.0791 2677   0.1579    0.468
 north_east       0.338 0.1625 2677   0.0190    0.656
 nothern_central  0.243 0.1494 2677  -0.0501    0.536
 south            0.281 0.1514 2677  -0.0161    0.578

Results are averaged over the levels of: exper, health, union 
Confidence level used: 0.95 
票数 2
EN

Stack Overflow用户

发布于 2021-10-22 09:46:28

这个潜在的解决方案使用biglm::biglm()来拟合lm模型,然后在指定的干扰条件下使用emmeans::qdrg()。这种方法对你的处境有帮助吗?

代码语言:javascript
运行
AI代码解释
复制
library(biglm)
library(emmeans)
## the biglm coefficients using factor() with all the `nr` levels has NAs.
## so restrict data to complete cases in the `biglm()` call
model_biglm <- biglm(wage ~ -1 +exper + residence+health + residence*union + factor(nr), data=Males[!is.na(Males$residence),])
summary(model_biglm)

## double check that biglm and lm give same/similar model
## summary(model_biglm)
## summary(model_lm)
summary(model_biglm)$rsq
summary(model_lm)$r.squared
identical(coef(model_biglm), coef(model_lm)) ## not identical!  but plot the coefficients...
head(cbind(coef(model_biglm), coef(model_lm)))
tail(cbind(coef(model_biglm), coef(model_lm)))
plot(cbind(coef(model_biglm), coef(model_lm))); abline(0,1,col="blue")


## do a "[q]uick and [d]irty [r]eference [g]rid and follow examples 
### from ?qdrg and https://cran.r-project.org/web/packages/emmeans/vignettes/FAQs.html 
  rg1 <- qdrg(wage ~ -1 + exper + residence+health + residence*union + factor(nr), 
              data = Males,
              coef = coef(model_biglm),
              vcov = vcov(model_biglm), 
              df = model_biglm$df.resid,
              nuisance="nr")
  
## Since we already specified nuisance in qdrg() we don't in emmeans():
  emmeans(rg1, c("residence","union"))

这意味着:

代码语言:javascript
运行
AI代码解释
复制
>   emmeans(rg1, c("residence","union"))
 residence       union emmean     SE   df lower.CL upper.CL
 rural_area      no      1.72 0.1417 2677     1.44     2.00
 north_east      no      1.67 0.0616 2677     1.55     1.79
 nothern_central no      1.53 0.0397 2677     1.45     1.61
 south           no      1.60 0.0386 2677     1.52     1.68
 rural_area      yes     1.63 0.2011 2677     1.23     2.02
 north_east      yes     1.72 0.0651 2677     1.60     1.85
 nothern_central yes     1.67 0.0503 2677     1.57     1.77
 south           yes     1.68 0.0460 2677     1.59     1.77

Results are averaged over the levels of: 1 nuisance factors, health 
Confidence level used: 0.95 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69581584

复制
相关文章
#define宏的边际效应
我们预想的a的值是2.5,可实际上a的值是3.5(这样说不太恰当,因为是取整,但为了说明先这样理解)
Jasonangel
2021/05/28
7300
EViews、Stata、回归分析……10月论坛答疑精选!
来自经管之家答疑频道 每个月,我们团队会特别邀请专家和版主,作为当月的特邀嘉宾,结合各自的领域,有针对性的进行答疑,并在当月答疑结束以后,对精彩的答疑进行梳理和汇总,我们从每位特邀嘉宾的答疑中,精选出
CDA数据分析师
2018/02/24
3.6K0
EViews、Stata、回归分析……10月论坛答疑精选!
机器学习模型可解释性进行到底 —— 从SHAP值到预测概率(二)
第一篇主要把SHAP值的各类图表操作方式进行展示: 机器学习模型可解释性进行到底 —— SHAP值理论(一)
悟乙己
2021/12/07
2.3K0
机器学习模型可解释性进行到底 —— 从SHAP值到预测概率(二)
R中如何计算效应值与无缝拼图
R语言数据分析指南
2023/08/18
3110
R中如何计算效应值与无缝拼图
黑盒模型实际上比逻辑回归更具可解释性
如何让复杂的模型具备可解释性,SHAP值是一个很好的工具,但是SHAP值不是很好理解,如果能将SHAP值转化为对概率的影响,看起来就很舒服了。先前阿Sam也写过一篇类似的文章,关于SHAP值的解释的,感兴趣的也可以一并阅读一下。MLK | 如何解决机器学习树集成模型的解释性问题
Sam Gor
2020/05/13
1.5K0
黑盒模型实际上比逻辑回归更具可解释性
盘点软件开发中那些有趣的边际效应
我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。
架构精进之路
2021/02/05
1.2K0
盘点软件开发中那些有趣的边际效应
r语言 固定效应模型_r语言coef函数
笔者认为一般统计模型中的横截面回归模型中大致可以分为两个方向:一个是交互效应方向(调节、中介效应)、一个是随机性方向(固定效应、随机效应)。
全栈程序员站长
2022/11/17
5.7K0
r语言 固定效应模型_r语言coef函数
PNAS:描绘自杀想法的时间尺度
本研究旨在利用实时监测数据和多种不同的分析方法,确定自杀思维的时间尺度。参与者是105名过去一周有自杀念头的成年人,他们完成了一项为期42天的实时监测研究(观察总数=20,255)。参与者完成了两种形式的实时评估:传统的实时评估(每天间隔数小时)和高频评估(间隔10分钟超过1小时)。我们发现自杀想法变化很快。描述性统计和马尔可夫转换模型都表明,自杀念头的升高状态平均持续1至3小时。个体在报告自杀念头升高的频率和持续时间上表现出异质性,我们的分析表明,自杀念头的不同方面在不同的时间尺度上运作。连续时间自回归模型表明,当前的自杀意图可以预测未来2 - 3小时的自杀意图水平,而当前的自杀愿望可以预测未来20小时的自杀愿望水平。多个模型发现,自杀意图升高的平均持续时间比自杀愿望升高的持续时间短。最后,在统计建模的基础上,关于自杀思想的个人动态的推断显示依赖于数据采样的频率。例如,传统的实时评估估计自杀欲望的严重自杀状态持续时间为9.5小时,而高频评估将估计持续时间移至1.4小时。
悦影科技
2023/06/28
2740
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据
最近我们被客户要求撰写关于潜类别(分类)轨迹模型LCTM的研究报告,包括一些图形和统计输出。
拓端
2023/01/03
7110
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据
在本文中,潜类别轨迹建模 (LCTM) 是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集,可以根据类的数量、模型结构和轨迹属性得出不同模型的分数
拓端
2023/02/13
8060
计量模型 | 固定效应与交互固定效应
在LSDV法下,FE本质就是控制变量,所以在经济含义上,FE(包括交互FE)与一般意义上的控制变量并无二致。
kemosabe
2021/10/12
2.5K0
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|数据分享
潜类别轨迹建模 (LCTM) 是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集,可以根据类的数量、模型结构和轨迹属性得出不同模型的分数。
拓端
2022/06/08
1K0
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|数据分享
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据
在本文中,潜类别轨迹建模 (LCTM) 是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集,可以根据类的数量、模型结构和轨迹属性得出不同模型的分数 ( 点击文末“阅读原文”获取完整代码数据)。
拓端
2022/10/26
9800
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据
在本文中,潜类别轨迹建模 (LCTM) 是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集,可以根据类的数量、模型结构和轨迹属性得出不同模型的分数
拓端
2023/03/27
4850
R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据
在本文中,潜类别轨迹建模 (LCTM) 是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集,可以根据类的数量、模型结构和轨迹属性得出不同模型的分数(点击文末“阅读原文”获取完整代码数据)。
拓端
2022/10/28
9910
R语言︱线性混合模型理论与案例探究(固定效应&随机效应)
笔者认为一般统计模型中的横截面回归模型中大致可以分为两个方向:一个是交互效应方向(调节、中介效应)、一个是随机性方向(固定效应、随机效应)。
悟乙己
2019/05/26
20.5K3
R语言线性混合效应模型(固定效应&随机效应)和交互可视化3案例|附代码数据
线性混合效应模型是在有随机效应时使用的,随机效应发生在对随机抽样的单位进行多次测量时。来自同一自然组的测量结果本身并不是独立的随机样本。因此,这些单位或群体被假定为从一个群体的 "人口 "中随机抽取的。示例情况包括
拓端
2022/12/27
1.7K0
R语言线性混合效应模型(固定效应&随机效应)和交互可视化3案例|附代码数据
线性混合效应模型是在有随机效应时使用的,随机效应发生在对随机抽样的单位进行多次测量时。来自同一自然组的测量结果本身并不是独立的随机样本。因此,这些单位或群体被假定为从一个群体的 "人口 "中随机抽取的。示例情况包括
拓端
2023/02/04
1.3K0
统计遗传学:第二章,统计分析概念
前几天推荐了这本书,可以领取pdf和配套数据代码。这里,我将各个章节介绍一下,总结也是学习的过程。
邓飞
2022/07/27
7440
统计遗传学:第二章,统计分析概念
R语言线性混合效应模型(固定效应&随机效应)和交互可视化3案例
线性混合效应模型是在有随机效应时使用的,随机效应发生在对随机抽样的单位进行多次测量时。来自同一自然组的测量结果本身并不是独立的随机样本。因此,这些单位或群体被假定为从一个群体的 "人口 "中随机抽取的。示例情况包括
拓端
2021/07/16
8.9K0
R语言线性混合效应模型(固定效应&随机效应)和交互可视化3案例

相似问题

如何提取茱莉亚面板数据后的平均边际效应(或预测值)?

17

根据zeroinfl()模型对象的预测概率计算边际效应

157

R概率回归边际效应

22

非个体固定效应的面板回归

12

Stata中个体边际效应的绘制

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文