2017-07-14 2 views
0

J'ai fait quantiles de taille égale avec la fonction cut2, maintenant je veux faire 4 sous-ensembles différents, au moyen des 4 quantiles.Faire des sous-ensembles au moyen de quantiles

premier et quatrième quantile je peux faire avec la fonction de sous-ensemble:

quantile1 <- subset (trial, NAG <22.1) 

quantile4 <- subset(trial, NAG >=61.6) 

Mais si j'essaie de faire des sous-ensembles de la deuxième et troisième quantile, il ne fonctionne pas tout à fait et je ne comprends pas Pourquoi. Voilà ce que j'ai essayé:

quantile2<- subset(trial, NAG >=22.1 | NAG<36.8) 

quantile3<-subset(trial, NAG >=36.8 | NAG <61.6) 

Si j'utilise cette fonction, R fait un sous-ensemble, mais le sous-ensemble se compose du nombre total d'observations, qui ne peut pas avoir raison. Quelqu'un a une idée de ce qui ne va pas avec la syntaxe ou comment y remédier?

Merci d'avance!

+0

Ne devrait-il pas être quantile3 <-subset (essai, NAG> = 36.8 & NAG <61.6) – maller

+0

Vous avez absolument raison! Ça fonctionne maintenant. Parfois, il peut être si facile ..;) – Sjurliee

+0

Découvrez [Venn-Diagrams] (https://en.wikipedia.org/wiki/Venn_diagram)! – maller

Répondre

0

J'ai eu le même genre de problème il y a un certain temps (here). Je fait une fonction GetQuantile qui pourrait vous être utile:

GetQuantile<-function(x,q,n){ 
    # Extract the nth quantile from a time series 
    # 
    # args: 
    # x = xts object 
    # q = quantile of xts object 
    # n = nthe quantile to extract 
    # 
    # Returns: 
    # Returns an xts object of quantiles 

    # TRUE/FALSE depending on the quantile we are looking for 
    if(n==1) # first quantile 
    test<-xts((coredata(x[,])<c(coredata(q[,2]))),order.by = index(x)) 
    else if (n== dim(q)[2]-1) # last quantile 
    test<-xts((coredata(x[,])>=c(coredata(q[,n]))),order.by = index(x)) 
    else # else 
    test<-xts( (coredata(monthly.returns[,])>=c(coredata(q[,n]))) & 
       (coredata(monthly.returns[,])<c(coredata(q[,(n+1)]))) ,order.by = index(x)) 
    # replace NA by FALSE 
    test[is.na(test)]<-FALSE 
    # we only keep returns for which we need the quantile 
    x[test==FALSE]<-NA 
    return(x) 
} 

avec cette fonction, je peux avoir un XTS avec tous les rendements mensuels du quantile que je veux et NA partout ailleurs. Avec ce xts je peux faire quelques trucs comme calculer la moyenne pour chaque ect quantile.

monthly.returns.stock.Q1<-GetQuantile(stocks.returns,stocks.quantile,1) 
rowMeans(monthly.returns.stock.Q1,na.rm = TRUE) 
0

J'ai eu le même problème. J'ai utilisé ceci:

df$cumsum <- cumsum(df$var) 
# makes cumulative sum of variable; my data were in shares, so they added up 
# to 100 

df$quantile <- cut(df$cumsum, c(0, 25, 50, 75, 100, NA), names=TRUE) 
# cuts the cumulative sum at desired percentile 

Pour les variables qui ne viennent pas en actions, j'ai utilisé les informations du résumé, où R vous donne quantiles puis couper les données en fonction de ces valeurs.

Question: Vos quantiles sont-ils égaux? Je veux dire, est-ce qu'ils contiennent tous exactement 25% d'observations? Parce que les miennes étaient grumeleuses ... c.-à-d. Que certaines étaient de 22%, d'environ 28%, etc. Je me demandais simplement comment vous aviez pu contourner cela.

+0

Vous pouvez utiliser la fonction 'cut2' {Hmisc}, au lieu de la fonction 'cut'. 'cut2' divise le groupe en catégories de taille égale. – Sjurliee

+0

Merci pour la réponse! – cremorna