r - 使用小于2个非NA值的svyquantile()

标签 r error-handling survey

我正在尝试计算由另一个变量分组的一个(或多个)变量的中位数。我正在使用svyby。问题在于某些组的非NA值可能少于2。

我使用此函数将NA返回到具有少于2个非NA值的组,但是它不起作用:

require(survey)
exemplo <- data.frame(ID = 1:10, var = rnorm(10), var2 = rnorm(10, 5), grupo = factor(c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'D', 'D')), peso = rchisq(10, 5))
exemplo[10, 2] <- NA
amostra <- svydesign(ids = ~ ID, data = exemplo, weights = ~ peso)

svyquantile <- function(x, design, quantiles, ...) {
    out <- try(survey::svyquantile(x = x, design = design, quantiles = quantiles, ...))
    termos <- attr(terms(x), "term.labels")
    out <- if (class(out) == "try-error") { matrix(NA, nrow = length(termos), ncol = length(quantile)) } else { out }
    colnames(out) <- quantiles
    rownames(out) <- termos
    return(out)
}
svyby(~ var + var2, ~ grupo, amostra, svyquantile, quantile = .5, na.rm = TRUE) # Não funciona

有人有什么主意吗?

最佳答案

首先,我不建议使用

~ var + var2

在调查包中..如果有任何缺失,则两者都缺失结果。比较:
svymean( ~ var + var2 , amostra , na.rm = TRUE )
svymean( ~ var2 , amostra , na.rm = TRUE )

而不是覆盖squaquantile,也许编写一个可以在条件确定的情况下调用它的函数?
myqt <- 
    function( ... ){ 

        a <- list( ... )

        this.qt <- if( is.null( a$quantile ) ) a[[3]] else a$quantile

        tt <- a[[2]]$variables

        # condition where svyquantile breaks
        if( sum( complete.cases( tt[ as.character( a[[1]] )[2] ] ) ) < 2 ){ 
            # re-create an empty svyquantile object of the same structure
            out <- matrix(rep(as.numeric(NA), length(this.qt)),nrow=1)
            dimnames(out) <- list( as.character(a[[1]])[2] , this.qt )

            # end the function
            return( out ) 

        # if svyquantile doesn't break, pass everything to it as normal
        } else svyquantile( ... )
    }

并请注意,您可以在svyby中使用它代替svyquantile
# test cases

myqt( ~ var , subset( amostra , grupo %in% 'A' ) , 0.5 )
myqt( ~ var , subset( amostra , grupo %in% 'A' ) , c( 0.25 , 0.5 ) )
myqt( ~ var , subset( amostra , grupo %in% 'C' ) , 0.5 )
myqt( ~ var , subset( amostra , grupo %in% 'C' ) , c( 0.25 , 0.5 ) )

svyby(~ var , ~ grupo, amostra, myqt, quantile = 0.5 , na.rm = TRUE, keep.var=F) 
svyby(~ var , ~ grupo, amostra, myqt, quantile = c( .25 , .5 , .75 ) , na.rm = TRUE, keep.var=F) 

关于r - 使用小于2个非NA值的svyquantile(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897462/

相关文章:

R 绘图标签,上标为第一个字符

r - 在 R 中使用字符串的内容作为函数参数

r - 合并数据帧并覆盖值

ruby-on-rails - Rails “The parameter passed to #in? must respond to #include?”

mysql - 用于 SPSS 分析的问卷数据库结构

r - 使用大型数据集确定 k 均值的最佳簇数

error-handling - Magento 2 : Use 404 page instead of autosearch

ruby-on-rails - Ruby on Rails i18n - 想要翻译模型中的自定义消息

php - 大型自定义调查/报告应用程序 - 最佳实践

java - 作为 IDE 的 Eclipse - 作为 Java 初学者,您发现缺少什么?