Compute quantiles incorporating Sample Design (Survey package)

本小妞迷上赌 提交于 2019-12-01 13:49:47
library(survey)

data(api)

dclus1 <- svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)

a <- svyquantile(~api00, design = dclus1, quantiles = seq(0, 1, by=0.1), method = "linear", ties="rounded")

# use factor() and findInterval()
dclus1 <- update( dclus1 , qtile = factor( findInterval( api00 , a ) ) )

# distribution
svymean( ~ qtile , dclus1 )


# or without the one observation in group number 11
dclus1 <- update( dclus1 , qtile = factor( findInterval( api00 , a[ -length( a ) ] ) ) )

# distribution
svymean( ~ qtile , dclus1 )



# quantiles by group
b <- svyby(~api00, ~stype, design = dclus1, svyquantile, quantiles = seq(0, 0.9 , by=0.1) ,ci=T)

# copy over your data
x <- apiclus1

# stype of each record
match( x$stype , b$stype ) 

# create the new qtile variable
x$qtile_by_stype <- factor( diag( apply( data.frame( b )[ match( x$stype , b$stype ) , 2:11 ] , 1 , function( v , w ) findInterval( w , v ) , x$api00 ) ) )

# re-create the survey design
dclus1 <- svydesign(id=~dnum, weights=~pw, data=x, fpc=~fpc)

# confirm you have quantiles
svyby( ~ qtile_by_stype , ~ stype , dclus1 , svymean )

The output from your whole code above is :

        0   0.1   0.2   0.3   0.4    0.5   0.6    0.7   0.8   0.9   1
api00 411 497.8 535.6 573.2 614.6 651.75 686.6 709.55 735.4 780.7 905

You can change the names to represent your groups. 0 and 1 represent minimum and maximum. 0.1 represents decile 1, 0.2 represents decile 2, etc. Something like:

dt_quantile = svyquantile(~api00, design = dclus1, quantiles = seq(0, 1, by=0.1), method = "linear", ties="rounded")
dt_quantile = data.table(dt_quantile)

setnames(dt_quantile, c("min",paste0("decile",1:10)))

dt_quantile = data.table(t(dt_quantile), keep.rownames = T)

dt_quantile 

#         rn     V1
# 1:      min 411.00
# 2:  decile1 497.80
# 3:  decile2 535.60
# 4:  decile3 573.20
# 5:  decile4 614.60
# 6:  decile5 651.75
# 7:  decile6 686.60
# 8:  decile7 709.55
# 9:  decile8 735.40
# 10: decile9 780.70
# 11: decile10 905.00

Am I missing your objective?

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!