Hvilken formel brukes i standardavviksfunksjonen sd
i R?
Kommentarer
- Generelt vil du kunne lese funksjonen ' s kode ved å bare ringe det uten parentes, som Gschneider gjorde.
- @OweJessen Selv om det er sant, er dette ofte ikke så nyttig som man skulle tro. Mange funksjoner i R er bare innpakninger som kaller underliggende C-kode. For eksempel fører sd deg til var, som fører deg til .Call (C_cov, x, y, na.method, FALSE).
Svar
Som påpekt av @Gschneider, beregner den standardavviket til prøven
$$ \ sqrt {\ frac {\ sum \ limits_ {i = 1} ^ {n } (x_i – \ bar {x}) ^ 2} {n-1}} $$
som du enkelt kan sjekke som følger:
> #generate a random vector > x <- rnorm(n=5, mean=3, sd=1.5) > n <- length(x) > > #sd in R > sd1 <- sd(x) > > #self-written sd > sd2 <- sqrt(sum((x - mean(x))^2) / (n - 1)) > > #comparison > c(sd1, sd2) #:-) [1] 0.6054196 0.6054196
Kommentarer
- Hvis du ser på hjelpesiden (? sd), står det " Liker var, dette bruker nevner n-1 ", hvis du av en eller annen grunn ikke ' ikke tror ocram ' s simulering 🙂
- @ Matt: Kanskje de burde oppdatere den hjelpefilen og si noe sånt som " dette returnerer sqrt av var "?
- @OweJessen, jeg tror det faktisk sier at " var returnerer sitt kvadrat! "
- Se også: stackoverflow.com/questions/9508518/ … for å lære hvorfor denne simuleringen kan gi forskjellige resultater for begge funksjonene.
- En annen enkel måte å teste den på er
sd( c(-1,0,1) )
som sender ut 1.
Svar
Ja. Teknisk beregner den variansen på prøven, og tar deretter kvadratroten:
> sd function (x, na.rm = FALSE) { if (is.matrix(x)) apply(x, 2, sd, na.rm = na.rm) else if (is.vector(x)) sqrt(var(x, na.rm = na.rm)) else if (is.data.frame(x)) sapply(x, sd, na.rm = na.rm) else sqrt(var(as.vector(x), na.rm = na.rm)) }