gpt4 book ai didi

r - 在重复观察的行之间产生一个精确的加权平均值

转载 作者:行者123 更新时间:2023-12-04 05:48:17 33 4
gpt4 key购买 nike

我有一个类似于下面生成的数据框。有些人对特定变量有多个观察值,并且每个变量都有一个相关的估计标准误差 (SE)。我想创建一个新的数据框,其中每个人只包含一行。对于具有多个观察值的个人,例如 Kim 或 Bob,我需要根据估计的标准误差以及新计算的加权平均值的方差来计算精确加权平均值。例如,对于 Bob,对于 var1,这意味着我希望他在新数据框中的 var1 值是:

weighted.mean(c(example$var1[2], example$var1[10]), 
c(1/example$SE1[2], 1/example$SE1[10]))

对于 Bob 的新 SE1,即加权均值的方差,为:
1/sum(1/example$SE1[2] + 1/example$SE1[10])

我尝试使用聚合函数并能够计算值的算术平均值,但是我编写的简单函数不使用标准错误,也无法处理 NA。
aggregate(example[,1:4], by = list(example[,5]), mean)

感谢您在开发一些代码以解决此问题方面的任何帮助。这是示例数据集。
set.seed(1562)
example=data.frame(rnorm(10,8,2))
colnames(example)[1]=("var1")
example$SE1=rnorm(10,2,1)
example$var2=rnorm(10,8,2)
example$SE2=rnorm(10,2,1)
example$id=
c ("Kim","Bob","Joe","Sam","Kim","Kim","Joe","Sara","Jeff","Bob")
example$SE1[5]=NA
example$var1[5]=NA
example$SE2[10]=NA
example$var2[10]=NA
example

var1 SE1 var2 SE2 id
1 9.777769 2.451406 6.363250 2.2739566 Kim
2 8.753078 2.174308 6.219770 1.4978380 Bob
3 7.977356 2.107739 6.835998 2.1647437 Joe
4 11.113048 2.713242 11.091650 1.7018666 Sam
5 NA NA 11.769884 -0.1310218 Kim
6 5.271308 1.831475 6.818854 3.0294338 Kim
7 7.770062 2.094850 6.387607 0.2272348 Joe
8 9.837612 1.956486 8.517445 3.5126378 Sara
9 4.637518 2.516896 7.173460 2.0292454 Jeff
10 9.004425 1.592312 NA NA Bob

最佳答案

我喜欢 plyr包解决这些问题。它应该在功能上等同于 aggregate ,但我认为它很好用,也很方便。在 website 上有很多示例和 plyr 的大约 20 页的介绍。 .对于这个问题,由于数据从一个 data.frame 开始,而你想要另一个 data.frame 在另一端,我们使用 ddply()

library(plyr)
#f1()
ddply(example, "id", summarize,
newMean = weighted.mean(x=var1, 1/SE1, na.rm = TRUE),
newSE = 1/sum(1/SE1, na.rm = TRUE)
)

返回:
    id newmean   newSE
1 Bob 8.8982 0.91917
2 Jeff 4.6375 2.51690
3 Joe 7.8734 1.05064
4 Kim 7.1984 1.04829
5 Sam 11.1130 2.71324
6 Sara 9.8376 1.95649

另请查看 ?summarize和 ? transform其他一些好的背景。您还可以将匿名函数传递给 plyr功能,如果需要更复杂的任务。

或使用 data.table可以证明某些任务更快的包:
library(data.table)
dt <- data.table(example, key="id")
#f2()
dt[, list(newMean = weighted.mean(var1, 1/SE1, na.rm = TRUE),
newSE = 1/sum(1/SE1, na.rm = TRUE)),
by = "id"]

快速基准:
library(rbenchmark)
#f1 = plyr, #f2 = data.table
benchmark(f1(), f2(),
replications = 1000,
order = "elapsed",
columns = c("test", "elapsed", "relative"))

test elapsed relative
2 f2() 3.580 1.0000
1 f1() 6.398 1.7872

所以 data.table()在我的简单笔记本电脑上,此数据集的速度提高了约 1.8 倍。

关于r - 在重复观察的行之间产生一个精确的加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407486/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com