2016-11-27 22 views
1

Я использую пакет simpleboot (https://cran.r-project.org/web/packages/simpleboot/index.html) для получения доверительных интервалов.plyr + simpleboot: NA в векторе вероятности

Это моя функция:

lb_weighted_median_dplyr <- function(x,v) { 
    set.seed(1234) 
    b <- one.boot(x, weights = v, FUN = function(x,w) matrixStats::weightedMedian(x, w = v, na.rm = TRUE), R = 100, student = FALSE) 
    round(perc(b, 0.025), 0) 
} 

Что функция делает для вычисления нижней границы доверительного интервала, когда я бегу

ddply(wage_by_gender_2015, .(sex,region), summarise, FUN = lb_weighted_median_dplyr(wage, exp_region)) 

Где wage это числовой столбец и exp_region является еще числовой столбец с весами.

У меня нет данных для некоторых регионов, поэтому функция терпит неудачу с некоторыми регионами и возвращает

Error in eval(substitute(expr), envir, enclos) : NA in probability vector 

Как я могу обойти эту ошибку и получить NA, как нижняя граница для области без данных?

dplyr эквивалентный подход, который также возвращает NA in probability vector является

grouped <- group_by(wage_by_gender_2015, sex, region) 
dplyr::summarise(grouped, FUN = lb_weighted_median_dplyr(wage, exp_region)) 

Соответствующий пример данных здесь: http://users.dcc.uchile.cl/~mvargas/casen/wage_by_gender_2015.RData

+0

Пожалуйста, предоставьте свои данные, используя 'dput()' –

+0

Вы говорите dplyr, но используете функцию plyr ... –

+0

Что вы имеете в виду? который пишет ASCII-текст – pachamaltese

ответ

2
wage_by_gender_2015 <- data.frame(sex = rep(c("male", "female"),100), 
            region = rep(c("north", "south", "east", 
               "west"), 50), 
            exp_region = abs(rnorm(100)), 
            wage  = abs(rnorm(100)) 
) 

wage_by_gender_2015$exp_region[10] <- NA 
ddply(wage_by_gender_2015, .(sex,region), summarise, FUN = lb_weighted_median_dplyr(wage, exp_region)) 
Error in sample.int(length(x), replace = TRUE, ...) : NA in probability vector 
# impute 
wage_by_gender_2015$exp_region <- RRF::na.roughfix(wage_by_gender_2015$exp_region) 

ddply(wage_by_gender_2015, .(sex,region), summarise, FUN = lb_weighted_median_dplyr(wage, exp_region)) 
sex region FUN 
1 female south 0 
2 female west 0 
3 male east 1 
4 male north 0 

Как уже говорилось в комментарии я бы использовал данные выборки, но не хватало sex.

+0

спасибо ... да, глупая моя ошибка обновление образца сейчас – pachamaltese

+1

Я обновил свой образец сейчас, и я тестирую ваше решение с полным dataset спасибо большое :) – pachamaltese

+1

@pachamaltese Добро пожаловать, дайте мне знать, если у вас есть какие-либо проблемы –