在人口五分位数的估算数据集中查找变量的均值

时间:2012-09-21 12:18:13

标签: r

我有一个缺少值的数据集“base_data”。因此,我使用“Amelia”软件包将缺失的值归入对象“a.output”。

我已经能够使用以下代码找到推算结果中某些变量的均值:

q.out<-NULL
se.out<-NULL
for(i in 1:m) {   
dclus <- svydesign(id=~site, data=a.output$base_data[[i]]) 

q.out <- rbind(q.out, coef(svymean(~hh_expenditure, dclus)))
se.out <- rbind(se.out, SE(svymean(~hh_expenditure, dclus)))}

我使用以下结果合并了结果:

svymean.combine <- mi.meld(q = q.out, se = se.out)

这给了我整个人口中家庭支出(hh_expenditure)的平均值和标准误差。

然而,我有一个变量将人口分成财富五分之一(wealth_quin)。

因此,我现在想要找出每个wealth_quin(一个变量1,2,3,4或5)的家庭支出的平均值和标准误差。

我最初尝试对插补数据进行子集化,但这会产生很多错误。

有没有办法做到这一点,而不必在输入数据之前将数据分成5个财富五分之一?

干杯,

蒂莫西

编辑:这是一个可行的例子

require(Amelia)
require(survey)
a<-as.data.frame(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16))
b<-as.data.frame(c(1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,2))
c<-as.data.frame(c(2,7,8,5,4,4,3,8,7,9,10,1,3,3,2,8))
d<-as.data.frame(c(3,9,7,4,5,5,2,10,8,10,12,2,4,4,3,7))
e<-as.data.frame(c(2500,8000,NA,4500,4500,NA,2500,NA,7400,9648,1112,1532,3487,3544,NA,7000)

impute<-cbind(a,b,c,d,e)
names(impute) <- c("X","site","var2","var3", "hh_inc") 

所以我们没有一个数据框可供使用,缺少hh_inc的值,我想用它来估算。 第一步,设置插补数量

m<-5

现在进行估算:

a.output <- amelia(x = impute, m=m, autopri=0.5,cs="X",
               idvars=c("site","var2"),
               logs=c("hh_inc","var3"))

a.output现在保存来自5个插补的数据。

我现在要做的是使用来自amelia的估算值分别找到站点1和站点2的平均值(和标准误差)hh_inc。

怎么可能这样做?我知道如果我忽略NA那就可以做到。但这可能会引入偏见,因此我首先将这些价值归咎于此。

干杯,

蒂莫西

编辑: 我已经为此付出了赏金。如果没有人知道确切的方法,那么可以使用Rubins公式(http://sites.stat.psu.edu/~jls/mifaq.html#minf)组合各个推算数据集的结果。 因此,我将奖励那些可以将Amelia对象中的5个独立的插补数据集转换为5个独立的完整数据框的人。

2 个答案:

答案 0 :(得分:4)

require(Amelia)
require(survey)
require(data.table)
require(plotrix)

a<-as.data.frame(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16))
b<-as.data.frame(c(1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,2))
c<-as.data.frame(c(2,7,8,5,4,4,3,8,7,9,10,1,3,3,2,8))
d<-as.data.frame(c(3,9,7,4,5,5,2,10,8,10,12,2,4,4,3,7))
e<-as.data.frame(c(2500,8000,NA,4500,4500,NA,2500,NA,7400,9648,1112,1532,3487,3544,NA,7000))

impute<-cbind(a,b,c,d,e)
names(impute) <- c("X","site","var2","var3", "hh_inc") 

summary(impute)


m <- 5
a.output <- amelia(x = impute, m=m, autopri=0.5,cs="X",
               idvars=c("site","var2"),
               logs=c("hh_inc","var3"))

stats.out <- NULL
for(i in 1:m){
df2 <- data.table(a.output$imputations[[i]])
df3 <-  data.frame(dataset=i,df2[,list(std.error(hh_inc),mean(hh_inc)), by="site"])
stats.out <- rbind(stats.out, df3)
}
colnames(stats.out) <- c("dataset","site","stdError","mean")
stats.out

答案 1 :(得分:1)

我不确定我是否了解您的问题或数据的结构(特别是数据是否被估算的重要性),但这是我如何按小组完成某些摘要统计。

require(data.table)
require(plotrix)

# create some data
df1 <- data.frame(id=seq(1,50,1), wealth = runif(50)*1000)
df1$cutter <- cut(df1$wealth, 5, labels=FALSE)
head(df1)
# put the data into a data.table to speed things up  
df2 <- as.data.table(df1)
head(df2)

grp1StdErr <- df2[,std.error(wealth), by="cutter"]
grp1Mean <- df2[,mean(wealth), by="cutter"]

希望这有帮助。

或者,在一个分组步骤中:

df2[,list(std.error(wealth),mean(wealth)), by=cut(wealth,5,labels=FALSE)]