R 中的频率加权,与 Stata 的结果比较

2024-06-27

我正在尝试分析明尼苏达大学 IPUMS 数据集中的数据1990 年美国人口普查 http://usa.ipums.org/usa/sampdesc.shtml#us1990a in R。我正在使用survey http://faculty.washington.edu/tlumley/survey/包,因为数据是weighted http://en.wikipedia.org/wiki/Sampling_%28statistics%29#Survey_weights。仅获取家庭数据(并忽略个人变量以使事情简单),我试图计算hhincome (家庭收入 http://internal.usa.ipums.org/usa-action/variables/HHINCOME)。为此,我创建了一个调查设计对象使用svydesign() http://faculty.washington.edu/tlumley/survey/example-design.html函数具有以下代码:

> require(foreign)
> ipums.household <- read.dta("/path/to/stata_export.dta")
> ipums.household[ipums.household$hhincome==9999999, "hhincome"] <- NA # Fix missing 
> ipums.hh.design <- svydesign(id=~1, weights=~hhwt, data=ipums.household)
> svymean(ipums.household$hhincome, ipums.hh.design, na.rm=TRUE)
      mean     SE
[1,] 37029 17.365

到目前为止,一切都很好。但是,如果我尝试在中进行相同的计算,我会得到不同的标准错误Stata (using 用于同一数据集不同部分的代码 http://www.stanford.edu/~mrosenfe/soc_meth_proj3/Intro%20to%20STATA%20for%20Soc%20180.htm):

use "C:\I\Hate\Backslashes\stata_export.dta"
replace hhincome = . if hhincome == 9999999
(933734 real changes made, 933734 to missing)

mean hhincome [fweight = hhwt] # The code from the link above.

Mean estimation                     Number of obs    = 91746420

--------------------------------------------------------------
             |       Mean   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
    hhincome |   37028.99   3.542749      37022.05    37035.94
--------------------------------------------------------------

而且,在寻找另一种给这只猫剥皮的方法时,作者survey, has 这个建议 http://pj.freefaculty.org/R/Rtips.html#1.12对于频率加权:

expanded.data<-as.data.frame(lapply(compressed.data,
               function(x) rep(x,compressed.data$weights)))

但是,我似乎无法让这段代码工作:

> hh.dataframe <- data.frame(ipums.household$hhincome, ipums.household$hhwt)
> expanded.hh.dataframe <- as.data.frame(lapply(hh.dataframe, function(x) rep(x, hh.dataframe$hhwt)))
Error in rep(x, hh.dataframe$hhwt) : invalid 'times' argument

我似乎无法解决这个问题。这可能与这个问题 http://r.789695.n4.nabble.com/error-with-source-invalid-times-value-td3234425.html.

总而言之:

  1. 为什么我没有得到相同的答案Stata and R?
  2. 哪一个是正确的(或者我在这两种情况下都做错了什么)?
  3. 假设我得到了rep()解决方案有效,会复制吗Stata的结果?
  4. 什么是right怎么办?如果答案允许我使用,那就太好了plyr http://had.co.nz/plyr/用于进行任意计算的包,而不是仅限于中实现的功能survey (svymean(), svyglm() etc.)

Update

因此,在我通过电子邮件从 IPUMS 获得了出色的帮助后,我使用以下代码来正确处理调查权重。我在这里描述以防其他人将来遇到这个问题。

初始 Stata 准备

由于 IPUMS 目前不发布用于将数据导入到的脚本R,你需要从Stata, SAS, or SPSS。我会坚持Stata目前。首先从 IPUMS 运行导入脚本。然后在继续之前添加以下变量:

generate strata = statefip*100000 + puma

这为每个创建一个唯一的整数PUMA格式为 240001,前两位数字为州 FIP 代码(马里兰州为 24),后四位数字为PUMAid 在每个州都是唯一的。如果你要使用R您可能还会发现运行它也很有帮助

generate statefip_num = statefip * 1

这将创建一个没有标签的附加变量,因为导入.dta文件到R应用标签并丢失底层整数。

斯塔塔和svyset

正如 Keith 所解释的,调查抽样是由Stata通过调用svyset.

对于个人层面的分析,我现在使用:

svyset serial [pweight=perwt], strata(strata)

这将权重设置为perwt,对我们上面创建的变量进行分层,并使用家庭serial用于说明聚类的数字。如果我们使用多年,我们可能想尝试

generate double yearserial = year*100000000 + serial

也考虑纵向聚类。

对于家庭层面的分析(不包括年份):

svyset serial [pweight=hhwt], strata(strata)

应该是不言自明的(尽管我认为在这种情况下序列实际上是多余的)。更换serial with yearserial将考虑时间序列。

这样做在R

假设您要导入.dta附加文件strata上面解释的变量并在单个字母处进行分析:

require(foreign)
ipums <- read.dta('/path/to/data.dta')
require(survey)
ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt)

或者在家庭层面:

ipums.hh.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=hhwt)

希望有人觉得这有帮助,并非常感谢 IPUMS 的 Dwin、Keith 和 Brandon。


1&2) 您引用的 Lumley 评论是 2001 年写的,早于他发表的任何调查包的作品,而调查包才发布了几年。您可能在两种不同的意义上使用“权重”。 (Lumley 在他的书的早期描述了三种可能的含义。)调查函数 svydesign 使用概率权重而不是频率权重。考虑到该数据集的巨大规模,这些似乎并不是真正的频率权重,而是概率权重,这意味着调查包结果是正确的,而 Stata 结果是错误的。如果您不相信,那么 Survey 包提供了函数 as.svrepdesign(),Lumley 的书中描述了如何从 svydesign 对象创建复制权重向量。

3)我认为是这样,但正如 RMN 所说......“这是错误的。”

4)因为它是错误的(IMO),所以没有必要。

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

R 中的频率加权,与 Stata 的结果比较 的相关文章

  • 如何按组计算日期之间的时间差

    我有一个包含日期 时间和位置的数据框 我想计算组内记录与上一条记录 根据日期排列 之间的分钟差异 并变异为新列 我已经弄清楚如何使用循环来完成此操作 但这仅适用于所有组 位置 而且我不确定如何按组执行此操作 fake data set fo
  • 贝叶斯网络中一个节点的条件概率修改(R代码)

    估计贝叶斯网络中的条件概率后 我问了一个节点 Inlet gas total Pressure 的概率如下 bn mle before Inlet gas total pressure 节点 Inlet gas total Pressure
  • 如何在R中用采样字符替换通配符

    我有以下顺序 s0 lt KDRH THLA RT HLAK 那里的通配符字符由 我想要做的是用该向量中的采样字符替换该字符 AADict lt c A R N D C E Q G H I L K M F P S T W Y V Since
  • 从 R 中的 glm 中提取系数

    我进行了逻辑回归 结果如下 ssi logit single age coefficients coefficients Intercept age 3 425062382 0 009916508 我需要选取系数age 目前我使用以下代码
  • 如何重新格式化数据并映射它?

    假设我有数据 其中列名称是城市 行名称是经度和纬度 Columbus Nashville Austin Washington D C London Manchester lon 82 99879 86 7816 97 74306 77 03
  • 将鼠标悬停在 ggplot 上时更新 CSS 和渲染工具提示以错误的顺序发生

    我在这里构建了一个虚拟应用程序 它为 ggplot 生成悬停消息 并确保它们保持在屏幕边界内 我编写了一些计算来确定所需的 CSS 更正并将其发送到服务器 它基于将悬停消息保留在此处的第一次尝试 SO问题 https stackoverfl
  • 计算网络中的周期

    最好的方法是什么 或者是否有任何方法可以实现对网络中的 3 个和 4 个周期进行计数 3 个周期等于从一个模式网络计算的三个节点 三角形 的连接组 4 个周期等于由两个模式网络计算的四个节点 方块 的连接组 如果我有这样的网络 onemod
  • ggplot2 黑白配色方案的建议

    我正在使用 ggplot2 生成许多结构如下的图表 有没有一种简单的方法可以制作出黑白效果很好的东西 我确实读过这个question https stackoverflow com questions 2895319 how to add
  • 使用 dplyr::mutate 重新编码而不在函数中工作

    我正在尝试使用dplyr mutate across 重新编码 a 中的指定列tbl 单独使用它们效果很好 但我无法让它们在函数中工作 library dplyr library tidyr df1 lt tibble Q7 1 1 5 Q
  • 从 r 中的数据帧中删除每第 n 列

    我试图通过删除每第三列来减小数据框的大小 这是我的示例数据框 example data frame x c 1 2 3 4 y c 1 2 3 4 z c 1 2 3 4 w c 1 2 3 4 p c 1 2 3 4 q c 1 2 3
  • 更改分配新变量的默认环境

    我经常想在全局环境下的一个环境中创建很多变量 这可以通过以下方式轻松完成envir论证sys source 如果由正在获取的文件创建的所有变量都应该进入单个环境 但我通常使用创建变量集的文件 一组应该进入一个环境 另一组应该进入另一个环境
  • 当 R 中出现“warnings()”时中断循环

    我有一个问题 我正在运行一个循环来处理多个文件 我的矩阵非常巨大 因此如果我不小心 我经常会耗尽内存 如果创建任何警告 是否有办法打破循环 它只是继续运行循环并报告它在很久以后失败 烦人 聪明的 stackoverflow ers 有什么想
  • 求R中3列中每一行的最大值

    我需要计算 3 列中每行的最大值 一个表可以是 x c 1 2 3 4 5 y c 2 3 3 1 1 z c 4 3 2 1 1 df lt data frame x y z 我需要得到 x y z max 1 1 2 4 4 2 2 3
  • 如何在闪亮的应用程序中初始化渲染项目的默认值

    介绍 In a shinyApp 我想用动态输入渲染输出 我的问题是 使用shinydashboard使用不同的选项卡 默认值来自 Input 仅当激活相应选项卡时才会呈现 想想输入和输出选项卡 当使用时我得到同样的行为switch声明in
  • 如何计算两个邮政编码之间的距离?

    我有一个美国邮政编码列表 我必须计算所有邮政编码点之间的距离 它是一个 6k 邮政编码长列表 每个实体都有邮政编码 城市 州 纬度 经度 面积和人口 所以 我必须计算所有点之间的距离 即 6000C2 组合 这是我的数据示例 我已经在 SA
  • 如何在R中绘制堆积柱形图?

    有谁知道如何使用 R 绘制由超过 1 个变量堆叠的列的直方图 就像excel中的 堆积柱形图 一样 谢谢你 我假设您确实想要一个条形图而不是直方图 在这种情况下 barplot从标准图形或barchart格子包中的两者都可以做到 或者使用
  • 在 ggplot2 中隐藏单个几何图例

    我将相同的变量 颜色 映射到两个不同几何图形中的颜色 我希望它们要么出现在单独的图例中 DHJ 和 EFI 要么最好完全跳过第二个图例 对于 E F 和 I 目前 R 将两者混合在一起 并给我一个图例 其中按字母顺序列出了 DEFHIJ 所
  • 如何为 R 中接下来的 2 个单元格复制相同的列值[重复]

    这个问题在这里已经有答案了 我正在尝试使用 R 为列中接下来的 2 个单元格复制相同的列值 我有以下形式的数据框 Time World Cate Data 1994 Africa A 12 1994 B 17 1994 C 22 1994
  • 根据值绘制具有条件颜色的折线图

    我想绘制折线图 根据值 它应该改变它的颜色 我发现的是 plot sin seq from 1 to 10 by 0 1 type p col ifelse sin seq from 1 to 10 by 0 1 gt 0 5 red ye
  • 在 R 中提取栅格的最快方法(提高我的可重现代码的时间)

    我想知道我是否已最大化提取栅格中某个点周围缓冲区域平均值的速度 本地的性能可以进一步提高吗 I use parallel mclapply已经 我知道我可以通过在集群上设置和运行它来获得进一步的收益 使用集群或获得更多的CPU不是我正在寻找

随机推荐