2011-02-25 28 views
6

Je voudrais faire une décomposition d'Oaxaca dans R. Il est utilisé par ex. l'économie du travail pour distinguer la variance expliquée par rapport à la variance inexpliquée, je crois. Je n'ai pas été capable de trouver une solution appropriée dans R, et je suis plutôt réticent à en créer un moi-même (je le ferais probablement gâcher).Décomposition d'Oaxaca dans R

Quoi qu'il en soit, la procédure est brièvement expliquée ici:

http://en.wikipedia.org/wiki/Ronald_Oaxaca

Stata est doté d'un ensemble assez bon pour cela, mais Stata est pas facilement disponible pour moi.

www.stata.com/meeting/5german/SINNING_stata_presentation.pdf

S'il vous plaît noter: J'ai posté un message sur R-help, mais il n'a obtenu aucune réponse. J'espère que vous pouvez aussi poster sur cette liste.

Merci à l'avance, Rasmus

Edit: j'ai fait la fonction suivante, qui semble donner des mauvaises réponses (urgh). J'ai essayé de suivre le lien ci-dessus Stata, mais cela n'a pas fonctionné comme je l'espérais :)

oaxaca <- function (fsex,frace1,frace2) { 
    ## First we make regresions 
    data1 <- subset(l2,sex==fsex & race==frace1) 
    data2 <- subset(l2,sex==fsex & race==frace2) 

    mindata1 <- subset(cbind(grade,exp,I(exp^2)),sex==fsex & race==frace1) 
    mindata2 <- subset(cbind(grade,exp,I(exp^2)),sex==fsex & race==frace2) 

    reg1 <- lm(log(wage)~grade+exp+I(exp^2), data=data1) 
    reg2 <- lm(log(wage)~grade+exp+I(exp^2), data=data2) 

    ## DECOMPOSITION 
    ################ 

    ## Variables 
    gap <- mean(log(wage[race==frace1 & sex==fsex]))-mean(log(wage[race==frace2 & sex==fsex])) 

    mean1 <- colMeans(mindata1) 
    mean2 <- colMeans(mindata2) 

    beta1 <- summary(reg1)$coefficients[,1] 
    beta2 <- summary(reg2)$coefficients[,1] 
    beta1incep <- summary(reg1)$coefficients[1,1] 
    beta2incep <- summary(reg2)$coefficients[1,1] 
    beta1coef <- summary(reg1)$coefficients[c(2,3,4),1] 
    beta2coef <- summary(reg2)$coefficients[c(2,3,4),1] 
    betastar <- .5*(beta1coef+beta2coef) 
    betastar2 <- (beta1+beta2)/2 

    expl <- sum((mean1-mean2)*beta1coef) 
    uexpl <- sum(mean2*(beta2coef-beta1coef)) 

    pct=expl/gap 
    pct2=uexpl/gap 

    ## output 
    out <- data.frame(Gap=gap, 
     Explained=expl, 
     Unexplained=uexpl, 
     Pct=pct*100) 

    return(out) 
} 
+0

eh, ne pas cross-post (mailinglist) les mêmes personnes lisent cela. –

+1

il n'a pas été répondu après une semaine si sûrement après cette période de temps, il est autorisé à demander ailleurs. –

+0

D'accord, je mettrais le -1 à son appartenance. des excuses pour être rapide à le distribuer. Maintenant, avec le code a déclaré la question semble beaucoup mieux de toute façon ... –

Répondre

7

Je l'ai utilisé décompositions de type Oaxaca. Je n'ai jamais trouvé de package pour R, j'ai donc écrit quelques fonctions qui le font. Il est similaire au paquet correspondant dans Stata. Vous pouvez trouver une copie dans: https://github.com/eyjo/Oaxaca

Notez que au moment où je me suis intéressé à l'aide de modèles effets fixes (données de panel), qui ne sont pas directement compatibles avec ces décompositions. Il existe un gestionnaire inachevé pour les modèles de type FE, mais il ne doit pas être utilisé. Je voulais créer un paquet, mais je n'ai jamais réussi à le contourner.

+1

Oh merveilleux. Ma fonction fait/non/donne des résultats corrects! Edit: Je pense que vous avez raison, sur FE. J'ai essayé un modèle en utilisant des facteurs, et il renvoie 'Error in B1 [1, 1] <- m1 $ intercept: nombre d'éléments à remplacer n'est pas un multiple de longueur de remplacement». J'espère que quelqu'un va prendre ce paquet. C'est un bon début :) – Rasmus

+0

Très très bien. Cette fonction devrait devenir un véritable paquet dans le r officiel. :) – S12000

4

Le paquet oaxaca sur Cran peut estimer décompositions Blinder-Oaxaca pour les modèles linéaires, ainsi que la production de graphiques à barres qui montrent les résultats: http://cran.r-project.org/web/packages/oaxaca/index.html

Il peut également calculer bootstrapped erreurs standard pour donner une idée de la quantité d'estimation l'incertitude est là.

La vignette donne une description détaillée des capacités du paquet, ainsi que quelques exemples de son utilisation. Voir ici: "oaxaca: Blinder-Oaxaca Decomposition in R"