Pondération de la fréquence en R, comparaison des résultats avec Stata
j'essaie d'analyser les données de L'ensemble de données IPUMS de L'Université du Minnesota pour le recensement des États-Unis de 1990R
. Je suis l'aide de la survey
colis, car les données sont pondéré. En prenant simplement les données du ménage (et en ignorant les variables de la personne pour garder les choses simples), j'essaie de calculer la moyenne de hhincome
(revenu du ménage). Pour ce faire j'ai créé un la conception de l'enquête l'objet à l'aide de la svydesign()
fonction avec le code suivant:
> require(foreign)
> ipums.household <- read.dta("/path/to/stata_export.dta")
> ipums.household[ipums.household$hhincome==9999999, "hhincome"] <- NA # Fix missing
> ipums.hh.design <- svydesign(id=~1, weights=~hhwt, data=ipums.household)
> svymean(ipums.household$hhincome, ipums.hh.design, na.rm=TRUE)
mean SE
[1,] 37029 17.365
jusqu'ici, tout va bien. Cependant, j'obtiens une erreur type différente si je tente le même calcul dans Stata
(en utilisant code destiné à une partie différente du même ensemble de données):
use "C:IHateBackslashesstata_export.dta"
replace hhincome = . if hhincome == 9999999
(933734 real changes made, 933734 to missing)
mean hhincome [fweight = hhwt] # The code from the link above.
Mean estimation Number of obs = 91746420
--------------------------------------------------------------
| Mean Std. Err. [95% Conf. Interval]
-------------+------------------------------------------------
hhincome | 37028.99 3.542749 37022.05 37035.94
--------------------------------------------------------------
et, en regardant une autre façon d'écorcher ce chat, l'auteur de survey
, a cette suggestion pour la fréquence pondération:
expanded.data<-as.data.frame(lapply(compressed.data,
function(x) rep(x,compressed.data$weights)))
Cependant, je n'arrive pas à obtenir ce code:
> hh.dataframe <- data.frame(ipums.household$hhincome, ipums.household$hhwt)
> expanded.hh.dataframe <- as.data.frame(lapply(hh.dataframe, function(x) rep(x, hh.dataframe$hhwt)))
Error in rep(x, hh.dataframe$hhwt) : invalid 'times' argument
je n'arrive pas à résoudre. Cela peut être lié à ce problème.
Donc, en somme:
- Pourquoi ne puis-je pas obtenir les mêmes réponses
Stata
etR
? - qui a raison (ou est-ce que je fais quelque chose de mal dans les deux cas)?
- en supposant que j'ai le
rep()
la solution de travail, ne serait-ce répliquerStata
'résultats? - What is the droit moyen de le faire? Bravo si la réponse me permet d'utiliser le
plyr
paquet pour faire des calculs arbitraires, plutôt que d'être limité aux fonctions implémentées danssurvey
(svymean()
,svyglm()
etc.)
mise à Jour
donc après l'excellente aide que j'ai reçue ici et de IPUMS par courriel, j'utilise le code suivant gérer correctement la pondération des enquêtes. Je décris ici au cas où quelqu'un d'autre a ce problème à l'avenir.
Préparation Initiale Des Statistiques
depuis IPUMS ne publient pas actuellement de scripts pour importer leurs données dans R
, vous aurez besoin pour commencer à partir de Stata
,SAS
, ou SPSS
. Je vais rester avec Stata
pour l'instant. Commencez par lancer le script d'importation depuis IPUMS. Alors avant de continuer ajouter la variable suivante:
generate strata = statefip*100000 + puma
Cela crée un entier unique pour chaque PUMA
du formulaire 240001, les deux premiers chiffres étant le code d'état fip (24 dans le cas du Maryland) et les quatre derniers a PUMA
id qui est unique par l'état. Si vous allez utiliser R
vous pouvez également trouver utile pour exécuter ce ainsi
generate statefip_num = statefip * 1
cela créera une variable supplémentaire sans étiquettes, puisque importer .dta
fichiers dans R
appliquer les étiquettes et perdre les entiers sous-jacents.
Stata et svyset
comme Keith l'a expliqué,Stata
en invoquant svyset
.
Pour un niveau individuel d'analyse maintenant j'utilise:
svyset serial [pweight=perwt], strata(strata)
cela fixe la pondération à perwt
, la stratification à la variable que nous avons créée ci-dessus, et utilise le ménage serial
nombre à prendre en compte clustering. Si nous utilisions plusieurs années, nous pourrions essayer
generate double yearserial = year*100000000 + serial
compte longitudinale de clustering.
pour l'analyse au niveau des ménages (sans années):
svyset serial [pweight=hhwt], strata(strata)
devrait être explicite (bien que je pense que dans ce cas-ci série est en fait superflu). En remplaçant serial
yearserial
tiendra compte d'une série chronologique.
en Faisant R
en supposant que vous importez un .dta
le fichier avec l' strata
variable expliquée ci-dessus et analysée à la lettre individuelle:
require(foreign)
ipums <- read.dta('/path/to/data.dta')
require(survey)
ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt)
Ou au niveau du ménage:
ipums.hh.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=hhwt)
espérons que quelqu'un trouve cela utile, et merci beaucoup à Dwin, Keith et Brandon de IPUMS.
3 réponses
1&2) le commentaire que vous avez cité de Lumley a été écrit en 2001 et est antérieur à tout son travail publié avec le paquet d'enquête qui a été seulement quelques années. Vous utilisez probablement "poids" dans deux sens différents. (Lumley décrit trois sens possibles tôt dans son livre.) La fonction d'enquête svydesign utilise des poids de probabilité plutôt que des poids de fréquence. Il semble probable que ce ne sont pas vraiment des poids de fréquence, mais plutôt des poids de probabilité, compte tenu de la taille massive de ce l'ensemble de données, et cela signifierait que le résultat de l'enquête est correct et le résultat Stata incorrect. Si vous n'êtes pas convaincu de cela, l'enquête offre la fonction.Svrepdesign () avec lequel le Livre de Lumley décrit comment créer un vecteur de poids répliqué à partir d'un objet svrepdesign.
3) je pense que oui, mais comme L'a dit RMN ..."Il serait faux."
4) puisque c'est mal (IMO) ce n'est pas nécessaire.
vous ne devriez pas utiliser les poids de fréquence dans Stata. C'est assez clair. Si L'IPUMS n'a pas de plan d'enquête" complexe", vous pouvez simplement utiliser:
mean hhincome [pw = hhwt]
Ou, pour plus de commodité:
svyset [pw = hhwt]
svy: mean hhincome
svy: regress hhincome `x'
ce qui est bien avec la deuxième option, c'est que vous pouvez l'utiliser pour des plans de sondage plus complexes (via des options sur svyset. Ensuite, vous pouvez exécuter beaucoup de commandes sans avoir à typ [pw...] tout le temps.
léger ajout pour les personnes qui n'ont pas accès à Stata ou SAS; (je mettrais cela dans les commentaires mais...) La bibliothèque SAScii peut utiliser le fichier de code SAS pour lire dans les données téléchargées IPUMS. Le code à lire dans les données est de doc
library(SAScii)
IPUMS.file.location <- "..\usa_00007dat\usa_00007.dat"
IPUMS.SAS.read.in.instructions <- "..\usa_00007dat\usa_00007.sas"
#store the IPUMS extract as an R data frame!
IPUMS.df <-
read.SAScii (
IPUMS.file.location ,
IPUMS.SAS.read.in.instructions ,
zipped = F )