【问题标题】:weighted table data frame with plyr带 plyr 的加权表数据框
【发布时间】:2014-10-03 18:51:28
【问题描述】:

我正在处理由多个问题(y1、y2、y3、...)的整数值响应和分配给每个受访者的加权计数组成的调查数据,如下所示:

foo <- data.frame(wcount = c(10, 1, 2, 3),        # weighted counts
                  y1 = sample(1:5, 4, replace=T), # numeric responses
                  y2 = sample(1:5, 4, replace=T), #
                  y3 = sample(1:5, 4, replace=T)) #
>foo
  wcount y1 y2 y3
1     10  5  5  5
2      1  1  4  4
3      2  1  2  5
4      3  2  5  3

我想将其转换为加权表的合并数据框版本,第一列表示响应值,接下来的 3 列表示加权计数。这可以通过列明确地使用:

library(Hmisc)
ty1 <- wtd.table(foo$y1, foo$wcount)
ty2 <- wtd.table(foo$y2, foo$wcount)
ty3 <- wtd.table(foo$y3, foo$wcount)

bar <- merge(ty1, ty2, all=T, by="x")
bar <- merge(bar, ty3, all=T, by="x")

names(bar) <- c("x", "ty1", "ty2", "ty3")
bar[is.na(bar)]<-0
>bar
  x ty1 ty2 ty3
1 1   3   0   0
2 2   3   2   0
3 3   0   0   3
4 4   0   1   1
5 5  10  13  12

我怀疑有一种方法可以使用 plyr 和 numcolwise 或 ddply 自动执行此操作。例如,以下内容很接近,但我不确定完成这项工作还需要什么:

library(plyr)
bar2 <- numcolwise(wtd.table)(foo[c("y1","y2","y3")], foo$wcount)
>bar2
        y1       y2       y3
1  1, 2, 5  2, 4, 5  3, 4, 5
2 3, 3, 10 2, 1, 13 3, 1, 12

有什么想法吗?

【问题讨论】:

  • 您好,您在进行什么调查?这看起来像多重插补,需要 mitools + survey 包来获得正确的置信区间。
  • 我正在与 EIA 等机构的美国住宅能源消耗调查 (RECS) 合作。很高兴看到几乎所有东西都有一个包,感谢您的参考!
  • 这只是一个基于复制的调查。您正在尝试重新发明轮子。如果您使用调查包,replicating their official methods 会更轻松。 :)
  • 当一个无知的工程师试图解决他不知道存在的另一个学科中看似基本问题的问题时,就会发生这种情况。谢谢开导!看来我还有很多事情要做。

标签: r plyr survey weighted


【解决方案1】:

不是一个 plyr 的答案,但这让我觉得这是一个重塑/聚合问题,可以使用包 reshape2 中的函数直接解决。

首先,melt 数据集,制作一列可以命名为x 的响应值(y1-y3 中的唯一值)。

library(reshape2)
dat2 = melt(foo, id.var = "wcount", value.name = "x")

现在可以使用dcast 将其转换为广角,使用sum 作为聚合函数。这会将y1-y3 作为列返回,wcount 的总和对应于x 的每个值。

# Cast back wide using the values within y1-y3 as response values
    # and filling with the sum of "wcount"
dcast(dat2, x ~ variable, value.var = "wcount", fun = sum)

给予

  x y1 y2 y3
1 1  3  0  0
2 2  3  2  0
3 3  0  0  3
4 4  0  1  1
5 5 10 13 12

【讨论】:

  • 这很好用,谢谢!我一直在使用融化,但我是一个演员新手,所以这非常有帮助。出于学习目的,我仍然有兴趣了解是否/如何使用 ddply 来完成,如果不能,为什么不。
【解决方案2】:

您正在描述一个使用重复权重的调查数据集。请参阅http://asdfree.com/ 以获取许多示例,但对于 recs,请执行以下操作:

library(survey)

x <- read.csv( "http://www.eia.gov/consumption/residential/data/2009/csv/recs2009_public.csv" )
rw <- read.csv( "http://www.eia.gov/consumption/residential/data/2009/csv/recs2009_public_repweights.csv" )
y <- merge( x , rw )

# create a replicate-weighted survey design object
z <- svrepdesign( data = y , weights = ~NWEIGHT , repweights = "brr_weight_[0-9]" )

# now run all of your analyses on the object `z` ..
# see the `survey` package homepage for details

# distribution
svymean( ~ factor( BASEHEAT ) , z )

# mean
svymean( ~ TOTHSQFT , z )

【讨论】:

  • 感谢您的示例! FWIW,我的最终目标不是找到带有 CI 的汇总统计数据,而是使用格子中的加权直方图和加权经验 cdf 图来探索几个连续响应(例如温度设置)的分布,它不支持权重(在密度图中除外),所以我不得不重新格式化数据以显示我想要的内容。 Survey 提供了其中一些功能,但我更喜欢多面板调节功能以在格中绘图。需要花一些时间进行调查,看看他们是否/如何一起工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2020-11-17
  • 2021-05-16
  • 2016-11-19
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多