2016-01-08 3 views
3

J'ai quelques problèmes pour calculer SE dans mon enquête. Voici un exemple de ce que je veux faire et je l'ai essayé d'utiliser l'ensemble de l'enquête dans l'affaire R. (fpc dans l'exemple égale ci-dessous nombre d'observations dans chaque strate)Poids de sondage R erreur-type

code pour générer des données:

id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) 
strata = c(6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8) 
weight = c(60, 75, 85, 140, 170, 175, 270, 310, 325, 785, 1450, 3920) 
fpc = c(8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 6, 6) 
answer = c("2", "2", "3", "1", "2", NA, NA, 2, "3", NA, "1", NA) 
df = data.frame(id, strata, weight, fpc, answer) 
df <- df[complete.cases(df), ] 

J'essaie ensuite de calculer la moyenne et S'en utilisant la trousse de sondage:

dstrat<-svydesign(id=~1,strata=~strata, weights=~weight, data=df, fpc=~fpc) 
svymean(~answer, dstrat) 

     mean SE 
answer1 0.60803 0.2573 
answer2 0.23518 0.1755 
answer3 0.15679 0.1479 

ma première question est: Comment puis-je prendre pour tenir compte des poids des observations qui n'ont pas répondu dans mon étude? Dans mon exemple ci-dessus, je supprime mes observations NA avant d'exécuter la fonction, mais j'aimerais inclure cette information. Je suppose que le SE sera plus grand ou plus petit selon si j'ai des réponses pour les observations avec les plus grands poids ou pas?

Ma deuxième question est: Comment puis-je calculer un SE pour une «valeur nette»? Supposons:

answer1 = good 
answer2 = neutral 
answer3 = bad 

Je peux calculer la "valeur nette" comme answer1 - = Réponse3 0,60803 au 0,15679 = 0,45124. Comment puis-je obtenir le SE pour cette "valeur nette"?

Répondre

2

votre première question appartient à stats.stackexchange - mais je pense que la réponse est que vous ne pouvez pas calculer le SE lorsque les données sont manquantes. mais voici comment résoudre pour le SE de votre deuxième question:

library(survey) 
id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) 
strata <- c(6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8) 
weight <- c(60, 75, 85, 140, 170, 175, 270, 310, 325, 785, 1450, 3920) 
fpc <- c(8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 6, 6) 
answer <- c("2", "2", "3", "1", "2", NA, NA, 2, "3", NA, "1", NA) 
df <- data.frame(id=id, strata=strata, weight=weight, fpc=fpc, answer=answer) 


# this is probably a mistake 
df <- df[complete.cases(df), ] 
# in most data sets, you should be using na.rm=TRUE later 
# and not tossing out statements before the `svydesign` gets run 

df$ones <- as.numeric(df$answer %in% 1) 

df$threes <- as.numeric(df$answer %in% 3) 

dstrat<-svydesign(id=~1,strata=~strata, weights=~weight, data=df, fpc=~fpc) 

a <- svymean(~ ones + threes , dstrat , na.rm = TRUE) 

svycontrast(a, list(avg=c(0,0), diff=c(1,-1))) 
+0

Merci pour une excellente réponse. Votre méthode de calcul du SE pour ma "valeur nette" avec la fonction svycontrast fonctionne parfaitement. Pour votre commentaire sur ma suppression de NA, vous avez tout à fait raison. J'ai d'abord essayé de mettre mon na.rm = TRUE dans la fonction svydesign qui n'a pas fonctionné. Comme vous l'avez souligné, mon na.rm = TRUE devrait être dans la fonction svymean. Pour ma question sur la prise en compte des poids des non-réponses dans le calcul de SE, je pense que cela devrait être possible. Je ne sais pas comment et peut-être que je vais prendre votre avis et poster cette question spécifique sur stats.stackexchange. – CaptHaddock