使用调查权重时如何为 Logit 模型生成边际效应?

2023-12-31

我通常使用 mfx 包和 logitmfx 函数生成 logit 模型边际效应。然而,我当前使用的调查具有权重(由于某些人群中的过度采样,这对样本中 DV 的比例有很大影响),而 logitmfx 似乎没有任何方法包含权重。

我已经用 svyglm 安装了模型,如下所示:

library(survey)

survey.design <- svydesign(ids = combined.survey$id,
                                        weights = combined.survey$weight,
                                            data = combined.survey)

vote.pred.1 <- svyglm(formula = turnout ~ gender + age.group + 
                                    education + income, 
                                 design = survey.design)
summary(vote.pred.1)

如何从这些结果中产生边际效应?


我也有同样的问题。下面我修改了 mfx 包中的一个函数,以使用作为调查对象组织的数据来计算边际效应。我没有做太多事情,主要是用调查包等效项替换“mean()”和旨在在非调查数据上运行的类似命令。修改后的 mfx 代码之后,有运行示例的代码。

背景

Alan Fernihough 的 mfx 包详细信息:https://cran.r-project.org/web/packages/mfx/mfx.pdf https://cran.r-project.org/web/packages/mfx/mfx.pdf

github上mfx包的代码(我修改的文件是probitmfxest.r和probitmfx.r):https://github.com/cran/mfx​​/tree/master/R https://github.com/cran/mfx/tree/master/R

在 mfx 计算器中,我注释掉了原始函数中内置的许多灵活性,这些函数处理有关集群和稳健 SE 的不同假设。我可能是错的,但我认为这些问题已经通过使用调查包 svyglm() 中的回归估计命令来解决。

边际效应计算器

 library(survey)

 probitMfxEstSurv <-
    function(formula, 
             design, 
             atmean = TRUE, 
             robust = FALSE, 
             clustervar1 = NULL, 
             clustervar2 = NULL, 
             start = NULL
             #           control = list() # this option is found in the original mfx package
    ){

      if(is.null(formula)){
        stop("model formula is missing")
      }

      for( i in 1:length(class(design))){
        if(!((class(design)[i] %in% "survey.design2") | (class(design)[i] %in% "survey.design"))){
          stop("design arguement must contain survey object")
        }
      }

      # from Fernihough's original mfx function
      # I dont think this is needed because the  
      # regression computed by the survey package should
      # take care of stratification and robust SEs
      # from the survey info
      # 
      #     # cluster sort part
      #     if(is.null(clustervar1) & !is.null(clustervar2)){
      #       stop("use clustervar1 arguement before clustervar2 arguement")
      #     }    
      #     if(!is.null(clustervar1)){
      #       if(is.null(clustervar2)){
      #         if(!(clustervar1 %in% names(data))){
      #           stop("clustervar1 not in data.frame object")
      #         }    
      #         data = data.frame(model.frame(formula, data, na.action=NULL),data[,clustervar1])
      #         names(data)[dim(data)[2]] = clustervar1
      #         data=na.omit(data)
      #       }
      #       if(!is.null(clustervar2)){
      #         if(!(clustervar1 %in% names(data))){
      #           stop("clustervar1 not in data.frame object")
      #         }    
      #         if(!(clustervar2 %in% names(data))){
      #           stop("clustervar2 not in data.frame object")
      #         }    
      #         data = data.frame(model.frame(formula, data, na.action=NULL),
      #                           data[,c(clustervar1,clustervar2)])
      #         names(data)[c(dim(data)[2]-1):dim(data)[2]] = c(clustervar1,clustervar2)
      #         data=na.omit(data)
      #       }
      #     }

      # fit the probit regression
      fit = svyglm(formula, 
                   design=design, 
                   family = quasibinomial(link = "probit"), 
                   x=T
      )
      # TS: summary(fit)

      # terms needed
      x1 = model.matrix(fit)
      if (any(alias <- is.na(coef(fit)))) {   # this conditional removes any vars with a NA coefficient
        x1 <- x1[, !alias, drop = FALSE]
      }

      xm = as.matrix(svymean(x1,design)) # calculate means of x variables
      be = as.matrix(na.omit(coef(fit))) # collect coefficients: be as in beta
      k1 = length(na.omit(coef(fit))) # collect number of coefficients or x variables
      xb = t(xm) %*% be # get the matrix product of xMean and beta, which is the model prediction at the mean
      fxb = ifelse(atmean==TRUE, dnorm(xb), mean(dnorm(x1 %*% be))) # collect either the overall predicted mean, or the average of every observation's predictions

      # get variances
      vcv = vcov(fit)

      # from Fernihough's original mfx function
      # I dont think this is needed because the  
      # regression computed by the survey package should
      # take care of stratification and robust SEs
      # from the survey info
      # 
      #     if(robust){
      #       if(is.null(clustervar1)){
      #         # white correction
      #         vcv = vcovHC(fit, type = "HC0")
      #       } else {
      #         if(is.null(clustervar2)){
      #           vcv = clusterVCV(data=data, fm=fit, cluster1=clustervar1,cluster2=NULL)
      #         } else {
      #           vcv = clusterVCV(data=data, fm=fit, cluster1=clustervar1,cluster2=clustervar2)
      #         }
      #       }
      #     }
      #     
      #     if(robust==FALSE & is.null(clustervar1)==FALSE){
      #       if(is.null(clustervar2)){
      #         vcv = clusterVCV(data=data, fm=fit, cluster1=clustervar1,cluster2=NULL)
      #       } else {
      #         vcv = clusterVCV(data=data, fm=fit, cluster1=clustervar1,cluster2=clustervar2)
      #       }
      #     }

      # set mfx equal to predicted mean (or other value) multiplied by beta
      mfx = data.frame(mfx=fxb*be, se=NA)

      # get standard errors
      if(atmean){#    fxb *  id matrix - avg model prediction * (beta X xmean)
        gr = as.numeric(fxb)*(diag(k1) - as.numeric(xb) *(be %*% t(xm)))
        mfx$se = sqrt(diag(gr %*% vcv %*% t(gr)))            
      } else {
        gr = apply(x1, 1, function(x){
          as.numeric(as.numeric(dnorm(x %*% be))*(diag(k1) - as.numeric(x %*% be)*(be %*% t(x))))
        })
        gr = matrix(apply(gr,1,mean),nrow=k1)
        mfx$se = sqrt(diag(gr %*% vcv %*% t(gr)))                
      }

      # pick out constant and remove from mfx table
      temp1 = apply(x1,2,function(x)length(table(x))==1)
      const = names(temp1[temp1==TRUE])
      mfx = mfx[row.names(mfx)!=const,]

      # pick out discrete change variables
      temp1 = apply(x1,2,function(x)length(table(x))==2)
      disch = names(temp1[temp1==TRUE])

      # calculate the disctrete change marginal effects and standard errors
      if(length(disch)!=0){
        for(i in 1:length(disch)){
          if(atmean){
            disx0 = disx1 = xm
            disx1[disch[i],] = max(x1[,disch[i]])
            disx0[disch[i],] = min(x1[,disch[i]])
            # mfx equal to    prediction @ x=1     minus prediction @ x=0
            mfx[disch[i],1] = pnorm(t(be) %*% disx1) - pnorm(t(be) %*% disx0)
            # standard errors
            gr = dnorm(t(be) %*% disx1) %*% t(disx1) - dnorm(t(be) %*% disx0) %*% t(disx0)
            mfx[disch[i],2] = sqrt(gr %*% vcv %*% t(gr))
          } else {
            disx0 = disx1 = x1
            disx1[,disch[i]] = max(x1[,disch[i]])
            disx0[,disch[i]] = min(x1[,disch[i]])  
            mfx[disch[i],1] = mean(pnorm(disx1 %*% be) - pnorm(disx0 %*% be))
            # standard errors
            gr = as.numeric(dnorm(disx1 %*% be)) * disx1 - as.numeric(dnorm(disx0 %*% be)) * disx0
            avegr = as.matrix(colMeans(gr))
            mfx[disch[i],2] = sqrt(t(avegr) %*% vcv %*% avegr)
          }
        }
      } 
      mfx$discretechgvar = ifelse(rownames(mfx) %in% disch, 1, 0)
      output = list(fit=fit, mfx=mfx)
      return(output)
    }



  probitMfxSurv <-
    function(formula, 
             design, 
             atmean = TRUE, 
             robust = FALSE, 
             clustervar1 = NULL, 
             clustervar2 = NULL, 
             start = NULL 
             #           control = list() # this option is found in original mfx package
    )
    {
      #    res = probitMfxEstSurv(formula, design, atmean, robust, clustervar1, clustervar2, start, control)
      res = probitMfxEstSurv(formula, design, atmean, robust, clustervar1, clustervar2, start)

      est = NULL
      est$mfxest = cbind(dFdx = res$mfx$mfx,
                         StdErr = res$mfx$se,
                         z.value = res$mfx$mfx/res$mfx$se,
                         p.value = 2*pt(-abs(res$mfx$mfx/res$mfx$se), df = Inf))
      colnames(est$mfxest) = c("dF/dx","Std. Err.","z","P>|z|")
      rownames(est$mfxest) =  rownames(res$mfx)

      est$fit = res$fit
      est$dcvar = rownames(res$mfx[res$mfx$discretechgvar==1,])  
      est$call = match.call() 
      class(est) = "probitmfx"
      est
    }

Example

  # initialize sample data
  nObs = 100
  x1 = rbinom(nObs,1,.5)
  x2 = rbinom(nObs,1,.3)
  #x3 = rbinom(100,1,.9)
  x3 = runif(nObs,0,.9)

  id = 1:nObs
  w1 = sample(c(10,50,100),nObs,replace=TRUE)
  #   dependnt variables
  ystar = x1 + x2 - x3 + rnorm(nObs)
  y = ifelse(ystar>0,1,0)
  #   set up data frame
  data = data.frame(id, w1, x1, x2, x3, ystar, y)

  # initialize survey
  survey.design <- svydesign(ids = data$id,
                             weights = data$w1,
                             data = data)

  mean(data$x2)
  sd(data$x2)/(length(data$x2))^0.5
  svymean(x=x2,design=survey.design)

  probit = svyglm(y~x1 + x2 + x3, design=survey.design, family=quasibinomial(link='probit'))
  summary(probit)

  probitMfxSurv(formula = y~x1 + x2 + x3, design = survey.design)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用调查权重时如何为 Logit 模型生成边际效应? 的相关文章

  • 从拟合的 lm 或 glm [R] 获取每个因子水平(以及交互作用)的数据数量

    我在 R 中有一个逻辑回归模型 其中所有预测变量都是分类变量而不是连续变量 除了响应变量 它显然也是分类 二元变量 打电话时summary model name 有没有办法在每个因子水平中包含一个表示观测值数量的列 我在 R 中有一个逻辑回
  • 分析和衡量 R 代码中的技术质量:有类似于 SonarQube 的工具吗?

    一个简单的问题 有人知道是否存在类似于 sonarqube 的 R 代码工具吗 或者声纳库 我的意思是 一个用于分析代码技术质量的工具 而不仅仅是突出显示或语法格式 提前致谢 您可以使用lintr并将结果上传到声纳Qube 这里有一个例子
  • 为什么我的 3D 绘图没有显示在 R Studio 绘图查看器中?

    我通常在 RStudio 版本 1 0 44 中查看绘图时没有问题 但是当我尝试查看使用 rgl 包创建的 3D 绘图时 我的 RStudio 绘图查看器中什么也没有出现 我能够毫无问题地绘制图 汽车 散点图 这是我正在使用的代码 inst
  • r 闪亮下载过滤数据表(DT)

    我正在尝试做一个shiny应用程序下载过滤后的Datatable 过滤与search 通过删除行进行过滤delete button 下载部分按预期工作 问题 当我第一次使用数据表中的搜索区域进行过滤时 如果我使用按钮删除一行 它会重置第一个
  • 如何在 nlme 与 lme4 中指定不同的随机效应?

    我想使用指定模型中的不同随机效应nlme lme 数据在底部 随机效应是 1 intercept and position变化超过subject 2 intercept变化超过comparison 这很简单 使用lme4 lmer lmer
  • R: pi[[j]] 中的错误:下标越界——数据帧列表上的 rbind

    我正在尝试重新绑定一个大的数据帧列表 outputDfList 它是通过将一个复杂的函数应用于一个大表而生成的 您可以通过以下方式重新创建outputDfList df1 data frame randomseq chr15q22 1 tr
  • R grep:有 AND 运算符吗?

    假设我有以下数据框 User Id Tags 34234 imageUploaded people jpg more comma separated stuff 34234 imageUploaded 12345 people jpg 我如
  • 使用 R 中的晶格为 xyplot 中的每个面板添加不同的垂直线

    我有一个按年份排列的几个站点的植物物种频率图 我正在使用 grid 包中的 xyplot 绘制这些站点 我已经弄清楚如何获取每个物种位点组合的散点图 但是 我想添加一个 abline 代表进行化学处理的每年 每个地点在不同年份添加了化学处理
  • ggplot2错误:美学必须是长度一,或者与数据长度相同问题:颜色、字母

    我收到此错误 错误 美学必须是长度一 或者与数据长度相同问题 颜色 字母 当我将 ggplot 与数据框一起使用时Z如图所示 Z lt data frame Name c A G C T T T AG AG GC GC CT CT AT A
  • 使用 ggplot2 和 geom_area 堆叠负/正时间序列

    我正在尝试重现一个堆积的时间序列图 该图显示银行资产负债表的构成和规模如何随时间变化 它应该看起来像这样 资产位于 x 轴上方 负债位于 x 轴下方 到目前为止 我已经能够使用以下方法成功重现图表的每一半ggplot plot assets
  • 如何将表输出复制到剪贴板?

    我试图通过单击按钮将表输出复制到剪贴板 我尝试查看 rclipboard 包 但以我有限的理解 它似乎无法复制输出 我添加了一个actionButton屏幕截图中带有一个图标来显示我想要实现的目标 现在按钮没有任何作用 Code libra
  • tm 包本身是否提供了组合文档术语矩阵的内置方法?

    tm 包本身是否提供了组合文档术语矩阵的内置方法 我在同一语料库上生成了 4 个文档术语矩阵 每个矩阵为 1 2 3 4 克 它们都非常大 200k 10k 因此将它们转换为数据帧然后绑定它们是毫无疑问的 我知道我可以编写一个程序来记录每个
  • 如何使用字符对象使用 dplyr 重命名列[重复]

    这个问题在这里已经有答案了 我想通过使用变量以动态方式使用 dplyr 重命名列 但是 它只是为列命名变量的名称 而不是其内容 有任何想法吗 colnames y 1 time channel 1 channel 2 channel 3 c
  • 导入 mgcv 失败,因为找不到 Rlapack.dll

    我想通过使用链接到 IronPython 中的 R 统计包R NET http rdotnet codeplex com 图书馆 它一直工作得很好 但现在我需要使用 R 的mgcv http cran r project org web p
  • 如何更改 ESS 中的智能分配键(“_”到“<-”)绑定

    在 emacs ESS 中 如何正确更改 ess smart S assign 的键绑定 我尝试的是添加 custom set variables ess smart S assign key to my emacs 但这让奇怪的事情发生了
  • ggplot 中的分层轴?

    我想知道是否可以在 GGLPOT2 或其他图形包 我只是更喜欢 ggplot 中制作分层 分段轴 我想要做的是获取下面的数据 制作一个堆积条形图 其中 x 轴上有周期 但在每个周期内 还有每种动物 那么每只动物内的条形颜色将是 颜色 变量
  • 是否可以旋转 R 中的绘图(基本图形)?

    我搜索了这个 发现使用 grid 有多种方法可以旋转图像 并且对于某些绘图 您可以使用它们的旋转 例如plot x y 而不是plot y x 不过我想知道是否有R 中旋转绘图的通用方法 适用于基础图形中生成的任何绘图 您可以导出图形 将其
  • 将缺失的行添加到数据表中

    我有一个数据表 library data table f lt data table id1 c 1 2 3 1 2 3 id2 as factor c a a b c b d v 1 6 key c id1 id2 id1 id2 v 1
  • 在 R 中绘制决策树(插入符)

    我已经训练了一个数据集rf方法 例如 ctrl lt trainControl method LGOCV repeats 3 savePred TRUE verboseIter TRUE preProcOptions list thresh
  • R Markdown 文档标题中的希腊字母

    R markdown 文档的标题中是否可以包含希腊字母 我试过这个 title Amylase author author date 8 March 2017 output pdf document keep tex true toc ye

随机推荐

  • 过程式编程的依赖注入

    假设我决定用 C 或任何其他过程编程语言编写一个大型应用程序 它具有具有调用依赖性的函数 如下所示 A B1 B2 C11 C12 C21 C22 显然 对叶子函数 C11 C12 C21 和 C22 进行单元测试非常简单 设置输入 调用函
  • 如何在 VS 2017.3 中引用 .NET 4.6 NuGet 包时隐藏 .NET Core 兼容性警告

    我正在开发一个 NET Core CLI 应用程序 该应用程序需要引用尚未发布的第 3 方 NuGet 包netcoreappX X目标 我已经运行了分析项目可移植性工具并得到100 兼容性 这是预期的 因为这是一个相对简单的库 然后问题就
  • 在 jQuery Mobile 中加载大型嵌套列表的最快方法是什么?

    我有一个大型嵌套数组 是通过在 PHP 中解析 CSV 文件生成的 我让它以 JSON 格式输出 并让我的 jQuery Mobile 站点获取它 然后将其解析为 DOM 列表 ul li 这在我的桌面浏览器上运行良好 但在我的移动设备上似
  • 本地主机拒绝连接 - MAMP Pro

    似乎有几个类似的问题但找不到答案 一小时前 以及之前的几个月 一切正常 看起来更新到 XCode 9 2 后一切都停止了 我刚刚更新到 MacOS High Sierra 10 13 2 因为其中包含一些 Apache 更新 但它没有解决问
  • Android 中的可滚动选项卡样式

    我想实现一个带有两层选项卡的导航 类似于此 但是 我找不到如何为可滚动选项卡提供这种外观 活动选项卡的标题居中 其他选项卡推到两侧 没有分隔符或下划线 我很确定我以前见过这种可滚动选项卡样式 所以我想知道它是否只是一个设置或者可能是第三方库
  • Android 最近的应用程序缩略图

    我的应用程序在 ICS 和 JB 设备上的最新应用程序列表中显示不正确 缩略图被剪切 扭曲 有时我的应用程序会出现完全不同的应用程序的屏幕截图 某些活动可能不会显示 尽管它们没有标记为从近期排除 可能出现什么问题以及我应该如何解决该问题 N
  • 向 Kibana 仪表板应用只读权限?

    有没有办法在与其他人共享 kibana 仪表板时设置某种权限 我担心有人会删除它或进行更改并保存它 我用谷歌搜索但没有找到任何东西 自从提出这个问题以来 发生了很多事情 自 5 月份起 基于角色的访问控制现已在社区版中提供 https ww
  • yargs 仅采用命令行输入字符串的第一个单词

    我正在教程中开发一个 Node js 命令行天气应用程序 我意识到当我输入一个字符串作为输入时 仅采用第一个单词 该字符串被拆分为一个单词数组 并且仅返回第一个单词 app js const yargs require yargs cons
  • iPhone - 如何识别我的应用程序的 iTunes 用户

    有一些应用程序似乎可以识别 iPhone 的 iTunes 用户 我需要开发一个支持 订阅 类型的应用内购买的应用程序 Apple 希望我的应用程序在每个用户的设备 iPhone iPod iPad 上授予订阅权限 为此 我可以构建一个服务
  • 创建表命令 SQL 缺少右括号

    创建下表时 我收到错误消息 ORA 00907 缺少右括号 create table CustomerOrder CustomerOrderNumber NUMBER 15 CONSTRAINT Customer Order Number
  • 如何在 F# 中实现 beta 缩减函数?

    我正在用 F 编写 lambda 演算 但我一直坚持实现 beta 约简 用实际参数替换形式参数 lambda x e f gt e f x 使用示例 lambda n n 2 3 7 gt n 2 3 7 n gt 7 2 3 所以我很想
  • html如何将H1、H2等设为链接?

    将 h1 h2 等标题转换为链接的正确代码是什么 search engines标题和链接的索引文本 Is it a href h1 heading h1 a or h1 a href heading a h1 谁能解释为什么 每这里 htt
  • 我可以使用资源字符串作为包名称吗?

    这样的事情可能吗
  • Vaadin 23 错误:找不到模块“@vaadin/build-status-plugin”

    我正在尝试从 Vaadin 18 升级到 Vaadin 23 执行升级说明中列出的步骤后 我在获取前端构建时遇到了大量问题 最新的阻止程序是启动应用程序后 npm 运行 但我看到以下错误 我检查了node modules文件夹 build
  • Go模板和函数

    在我的 go 代码中我经常使用if像这样 if user user Registered go 模板中的等效代码是 if and User User Registered end 不幸的是 如果模板中的代码失败 User is nil 在g
  • 将 NSDecimalNumber 转为负数

    我正在寻找一种方法来扭转NSDecimalNumber乘以负数 1 decNumber is the one I would like to turn negative NSDecimalNumber decNumber values ob
  • getter 是否应该返回对象实例的副本以避免副作用?

    我想获取从类的函数返回的值 在我的班级里 public class MyClass private Color color new Color 0f 0f 0f 1f public Color getColor return this co
  • 多维 np.argmax?

    我有一个形状为 n n g 的 3D 数组 并且我需要每个 n n argmax 即结果应该是每个长度为 g 的两个索引向量 x y 直观的解决方案是 array np random uniform size 5 5 1000 np arg
  • Node.js、(Hi)Redis 和 multi 命令

    我正在使用 node js 和 redis 并通过此命令安装了hiredis 库 npm install hiredis redis 我在这里查看了多个示例 https github com mranney node redis blob
  • 使用调查权重时如何为 Logit 模型生成边际效应?

    我通常使用 mfx 包和 logitmfx 函数生成 logit 模型边际效应 然而 我当前使用的调查具有权重 由于某些人群中的过度采样 这对样本中 DV 的比例有很大影响 而 logitmfx 似乎没有任何方法包含权重 我已经用 svyg