2017-04-24 3 views
1

Ich versuche eine ganze lange Liste von Binomialkonfidenzintervallen für Proportionen zu berechnen. Ich habe eine Liste von Proben mit einer Spalte für die Dorfnummer (24 Dörfer) und eine Spalte mit + oder - für das Testergebnis (PCR). Ich muss den Anteil der + Testergebnisse in jedem Dorf und die entsprechenden Konfidenzintervalle kennen. Der folgende Code gibt mir die Konfidenzintervalle für den Anteil des gesamten Sets, aber ich muss es nach Dorf aufschlüsseln.Genaue Binomialkonfidenzintervalle für mehrere Proportionen

a = sum(dat$PCR=='+') 
p = length(dat$PCR) 
binom.test(a, p, p = 0.5, 
     alternative = c("two.sided", "less", "greater"), 
     conf.level = 0.95) 
+2

Wenn Sie uns eine Probe Ihres Daten zeigen (Paste in Frage Ausgang 'dput (data_sample)') wird es einfacher sein, Ihnen zu helfen. – eipi10

Antwort

1

hier ein tidyverse Ansatz, mit gefälschten Daten dargestellt:

library(tidyverse) 
library(broom) 

# Fake data 
set.seed(2) 
dat = data.frame(village=rep(LETTERS[1:24], each=100), 
       PCR=sample(c("+","-"), 100*24, replace=TRUE)) 

# Set "+" to be the reference level 
dat$PCR = factor(dat$PCR, levels=c("+","-")) 

Nun wird der Code unter dem ersten Splits dat von village und führt das Ergebnis zu map_df. map_df läuft binom.test auf den Daten für jede Ebene von village. binom.test gibt eine Liste zurück, aber das Wrapping in tidy verwandelt die Ausgabe von binom.test in einen "sauberen" Datenrahmen. Also haben wir am Ende einen Datenrahmen, wo jede Zeile die Ausgabe von binom.test für ein Dorf ist.

split(dat, dat$village) %>% 
     map_df(~ tidy(binom.test(table(.x$PCR), p=0.5, 
         alternative = c("two.sided", "less", "greater"), 
         conf.level = 0.95)), .id="Village") 

binom.test.results 
Village estimate statistic p.value parameter conf.low conf.high    method alternative 
1  A  0.55  55 0.36820162  100 0.4472802 0.6496798 Exact binomial test two.sided 
2  B  0.54  54 0.48411841  100 0.4374116 0.6401566 Exact binomial test two.sided 
3  C  0.48  48 0.76435343  100 0.3790055 0.5822102 Exact binomial test two.sided 
4  D  0.55  55 0.36820162  100 0.4472802 0.6496798 Exact binomial test two.sided 
5  E  0.43  43 0.19334790  100 0.3313910 0.5328663 Exact binomial test two.sided 
6  F  0.47  47 0.61729941  100 0.3694052 0.5724185 Exact binomial test two.sided 
7  G  0.49  49 0.92041076  100 0.3886442 0.5919637 Exact binomial test two.sided 
8  H  0.49  49 0.92041076  100 0.3886442 0.5919637 Exact binomial test two.sided 
9  I  0.53  53 0.61729941  100 0.4275815 0.6305948 Exact binomial test two.sided 
10  J  0.50  50 1.00000000  100 0.3983211 0.6016789 Exact binomial test two.sided 
11  K  0.49  49 0.92041076  100 0.3886442 0.5919637 Exact binomial test two.sided 
12  L  0.50  50 1.00000000  100 0.3983211 0.6016789 Exact binomial test two.sided 
13  M  0.45  45 0.36820162  100 0.3503202 0.5527198 Exact binomial test two.sided 
14  N  0.59  59 0.08862608  100 0.4871442 0.6873800 Exact binomial test two.sided 
15  O  0.41  41 0.08862608  100 0.3126200 0.5128558 Exact binomial test two.sided 
16  P  0.50  50 1.00000000  100 0.3983211 0.6016789 Exact binomial test two.sided 
17  Q  0.54  54 0.48411841  100 0.4374116 0.6401566 Exact binomial test two.sided 
18  R  0.52  52 0.76435343  100 0.4177898 0.6209945 Exact binomial test two.sided 
19  S  0.44  44 0.27125302  100 0.3408360 0.5428125 Exact binomial test two.sided 
20  T  0.55  55 0.36820162  100 0.4472802 0.6496798 Exact binomial test two.sided 
21  U  0.47  47 0.61729941  100 0.3694052 0.5724185 Exact binomial test two.sided 
22  V  0.52  52 0.76435343  100 0.4177898 0.6209945 Exact binomial test two.sided 
23  W  0.54  54 0.48411841  100 0.4374116 0.6401566 Exact binomial test two.sided 
24  X  0.51  51 0.92041076  100 0.4080363 0.6113558 Exact binomial test two.sided 
+0

'tidy' funktioniert auch gut innerhalb von' do' auf einem gruppierten data.frame: 'dat%>% group_by (dorf)%>% do (broom :: tidy (binom.test (tabelle (. $ PCR)))) ' – alistaire

+0

Danke @alistaire. 'Do' erschien mir immer irgendwie klobig, also entfernte ich mich von ihm, als die neuen' tidyverse' Alternativen kamen, aber vielleicht sollte ich es mir noch einmal überlegen. – eipi10

Verwandte Themen