Skip to content

Instantly share code, notes, and snippets.

@benilton
Created September 23, 2011 15:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benilton/1237671 to your computer and use it in GitHub Desktop.
Save benilton/1237671 to your computer and use it in GitHub Desktop.
Explicacao do problema....
## funcao initial
equantileByCounts <- function(x, counts, qs){
tot <- sum(counts)
i <- order(x)
x <- x[i]
counts <- counts[i]
partial <- cumsum(counts)
qsObs <- qs*tot
start <- floor(qsObs)
end <- ceiling(qsObs)
i <- length(qs)
aux1 <- sapply(1:i,
function(.x, start, end, x){
coord <- c(start[.x], end[.x])
bins <- c(1, partial)
grps <- cut(coord, bins, labels=FALSE, include.lowest=T)
mean(x[grps])
}, start=start, end=end, x=x)
names(aux1) <- names(qs)
return(aux1)
}
## INICIO
## Leitura de dados
entra = read.csv2("Arquivo 1.csv", dec = ",", stringsAsFactors=FALSE)
##
## Um monte de manipulacao que nao interessa no momento
##
## Determinacao de pond
entra$pond = entra$val / entra$peso
##
## Outras manipulacoes que nao interessam no momento
##
univ = subset(entra, select = c(codigo, peso, val, pond))
## entra no for()
## modifico o subconjunto para mostrar o q estou a dizer
tmp = univ
grupoProblema = split(tmp, tmp$codigo)[[22]]
## execute abaixo para confirmar o problema
## equantileByCounts(grupoProblema$pond, grupoProblema$val, c(.25, .75))
## Note que vc quer os quantis de 'pond' ponderados por 'val'... ie, 'val' sao os pesos reais das obs 'pond'.
## Conte quantas vezes o valor 25 aparece em 'pond': 39 vezes!!!! e isso nao deve ocorrer (veja a teoria que
## envolve uso de ponderacao)
table(grupoProblema$pond == 25)
## Ou seja, vc precisaria agregar suas variaveis de alguma forma
## (em teoria, isso deveria ser antes de determinar 'pond')
agregados = with(grupoProblema, aggregate(list(peso=peso), by=list(val=val), sum))
agregados = subset(agregados, peso > 0)
agregados$pond = agregados$val/agregados$peso
equantileByCounts(agregados$pond, agregados$val, c(.25, .75))
## eu sei que o resultado nao eh o q vc espera
## mas ai' o problema e' outro....
## entao fica o exercicio para vc
## determine manualmente os quantis para o conteudo de grupoProblema
## dai' e' possivel corrigir a funcao.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment