2

我有一个缺少值的数据集“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)。

因此,我现在想要找到每个财富 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 是可以做到的。但这可能会引入偏见,因此我首先估算了这些值。

干杯,

提摩太

编辑:我对此给予了赏金。如果没有人知道确切的方法,那么可以使用鲁宾斯公式(http://sites.stat.psu.edu/~jls/mifaq.html#minf)将各个估算数据集的结果组合起来。 ,我将奖励能够将 5 个独立的估算数据集从 Amelia 对象转换为 5 个独立的、完整的数据帧的人。

4

2 回答 2

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
于 2012-09-23T13:45:09.203 回答
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)]
于 2012-09-21T17:04:08.727 回答