Seite 1 von 1

Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Do Dez 06, 2018 2:24 pm
von 8ZRbP
Hallo zusammen,

ich suche ein package bei dem sich Cohens d für sehr viele Pairs effektiv berechnen lässt. D.h ich will eine Funktion mit der ich als Eingabeparameter einen Vektor M (Mittelwerte) und einen Vektor SD (Standardabweichung) habe. Ich will also als Rückgabewert nicht nur ein (!) Cohens d sondern für alle möglichen Pairs an Mittelwerten, ähnlich wie bei einer Korrelationsmatrix alle Pairs ausgegeben werden.

D.h. die Funktion müsste so sein:

d <-- (M, SD)

Eingabevektoren wären:

M <-- (m1, m2, ..., m_n)
SD <-- (sd1, sd2, ...sd_n)

Also Ausgabevektor will ich:

d = (d_m1/m2, d_m1/m3, ...., d_m2/m3, ..., d_m_n-1/m_n).

Ich will als Rückgabewert also Cohens d für alle M-Pairs. Bei den Funktionen zur Berechnung von Cohens d die ich bisher gefunden habe, wird Cohens d jeweils nur für ein M-Pair berechnet. Die Funktion ist dann z.B. d <-- (M, SD) und Rückgabewert ist d = d_M/SD. Es ist mir aber zu mühsam die M-Pairs einzeln einzugeben, wenn es sehr viele Kombinationen an M-Pairs gibt, daher suche ich eine Funktion wie oben beschrieben.

(Falls es so eine noch nicht gibt, wie könnte ich die Funktion mit einfachen Mitteln selbst programmieren?)

Besten Dank und Grüße,

8ZRbP

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Do Dez 06, 2018 2:52 pm
von jogo
Vielleicht kannst Du ja dies nutzen:
https://stackoverflow.com/questions/154 ... ffect-size

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Do Dez 06, 2018 10:45 pm
von EDi
Hier ein Beispiel wie man es angehen könnte:

Code: Alles auswählen

m <- c(1, 2, 3)
sd <- c(10, 10, 10)

# create all pairwise comparisons
n <- length(m)
comb <- data.frame(t(combn(seq_len(n), 2)))

# funtion to compute cohen's from 2 means & two sds (assuming equal n)
cd <- function(m, s) {
  stopifnot(length(m) == 2)
  stopifnot(length(s) == 2)
  d <- abs(diff(m)) / sqrt(sum(s^2))
  d
}
cd(m[1:2], sd[1:2])

# loop over all combinations
out <- comb

out$d <- sapply(seq_len(nrow(comb)), function(i) {
  take <- comb[i, ]
  cd(c(m[take [[1]]], m[take[[2]]]), 
     c(sd[take[[1]]], sd[take[[2]]]))
})
out

Wie immer, ohne Gewähr
Die Dreiecksmatrix darfst du selbst daraus erstellen ;)

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Di Jan 01, 2019 6:26 pm
von 8ZRbP
Hallo EDi,

besten Dank für den Codeschnipsel. Hattest Du ihn getestet? Bisher konnte ich noch keine Ausgabe erzeugen.

Habe es auf drei Wegen versucht:

1. Der erste Weg wird Dir nicht gefallen ;(. Mittlerweile gibt es in SPSS die Möglichkeit, direkt in SPSS R-Code auszuführen. Das habe ich mir o.g. Codeschnipsel gemacht, es kommt dann diese Fehlermeldung: Error: unexpected end of input

2. Habe den Codeschnipsel in R-Studio ausgeführt. Es kommt dann keine Fehlermeldungen, jedoch werden auch keine Werte für Cohens d ausgegeben.

2. Habe den Codeschnipsel direkt in der R-Console ausgeführt. Es kommt dann keine Fehlermeldungen, jedoch werden auch keine Werte für Cohens d ausgegeben.


Wäre toll, wenn ich den Codeschnipsel zum laufen bekommen könnte, das könnte mir noch öfters das Leben vereinfachen und gute Dienste leisten. :)


Grüße,
8ZRBp

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Di Jan 01, 2019 6:57 pm
von 8ZRbP
jogo hat geschrieben: Do Dez 06, 2018 2:52 pm Vielleicht kannst Du ja dies nutzen:
https://stackoverflow.com/questions/154 ... ffect-size
Danke für den Link. Ich habe die beiden geposteten Codeschnipsel getestet. Beide funktionieren, jedoch erfordern diese, dass die beiden Eingabevektoren jeweils eine Stichprobe enthält, es wird also nur ein einzelner Wert für Cohens d berechnet. Die von mir gewünschte Vereinfachung ist damit somit nicht möglich.

Ich hoffe immer noch darauf, EDis Code zu laufen zu bringen. Soweit ich den Code analysiert habe, müsste der Codeschnipsel die von mir gewünschte Vereinfachung umsetzen, sobald er funktioniert.

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Di Jan 01, 2019 7:12 pm
von 8ZRbP
8ZRbP hat geschrieben: Di Jan 01, 2019 6:26 pm Wäre toll, wenn ich den Codeschnipsel zum laufen bekommen könnte, das könnte mir noch öfters das Leben vereinfachen und gute Dienste leisten. :)

Ich Trottel habe einen Fehler gemacht. Ich habe im Fenster mit dem Code die Scrollbar übersehen, und dadurch nur einen Teil des Codes ausgefüllt. Jetzt habe ich meine Dummkeit bemerkt und den vollständigen Code ausgeführt. Der Code gibt jetzt etwas aus, die Ausgabewerte scheinen aber nicht zu stimmen.

Um das besser überprüfen zu können, habe ich die Eingabewerte noch etwas vereinfacht, dass zum testen erstmal nur zwei Stichproben miteinander verglichen. Nämlich zwei Stichproben mit M1 = 15, SD1 = 7 und M2 = 7 und SD2 = 11. Somit habe ich EDis Code mit diesem minimal abgeänderten Eingabevektor ausgeführt:

Code: Alles auswählen

m <- c(15, 20)
sd <- c(7, 11)
Als Wert für Cohens d wird dann ausgegeben: 0.3834825

Wenn ich Cohens d jedoch mit einem der vielen Online-Rechner nachrechne, komme ich auf den Wert 0.542. Diese beiden Online-Rechner kommen unabhängig voneinander auf einen Wert von 0.542 für Cohens d bei o.g. Eingabewerten:

https://www.psychometrica.de/effektstaerke.html
https://statistikguru.de/rechner/cohens-d.html

Also gibt es zwei Möglichkeiten:

1. Es ist noch ein kleines Fehlerchen im Code.
2. Ich habe die Eingabevektoren falsch verstanden und dadurch falsch nachgerechne.


Wäre toll für mich, noch mal einen Fingerzeig zu erhalten! :)

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Do Jan 03, 2019 3:22 pm
von EDi
. Es ist noch ein kleines Fehlerchen im Code.
Es ist ein Fehler in der Funktion welche das d aus zwei Mittelwerten und sd berechnet. :oops:

Da sowohl die Funktion als auch die Mathematik einfach sind, überlasse ich es dir zur Übung den Fehler zu finden und die Funktion zu debuggen. :l Ist was ganz einfaches...

Re: Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Verfasst: Mi Jan 16, 2019 6:29 pm
von 8ZRbP
EDi hat geschrieben: Do Jan 03, 2019 3:22 pm
. Es ist noch ein kleines Fehlerchen im Code.
Es ist ein Fehler in der Funktion welche das d aus zwei Mittelwerten und sd berechnet. :oops:

Da sowohl die Funktion als auch die Mathematik einfach sind, überlasse ich es dir zur Übung den Fehler zu finden und die Funktion zu debuggen. :l Ist was ganz einfaches...
Danke, das hat mir schon geholfen, an der richtigen Stelle zu suchen. Offenbar hat in der Formel zur Berechnung von d nur ein /2 (Division durch 2) gefehlt. Erste Testungen haben nach Korrektur dieses Fehlerchens zu richtigen Fehlern geführt. Ich poste unten noch den so geringfügig verbesserten Code. Nachher werde ich das Programm mit weiteren Eingaben testen. Wenn ich mich nicht mehr melde, hat das Programm wie erwartet funktioniert.

Besten Dank noch mal für Deine wertvolle Hilfe!


Code: Alles auswählen

m <- c(1, 2, 3)
sd <- c(10, 10, 10)

# create all pairwise comparisons
n <- length(m)
comb <- data.frame(t(combn(seq_len(n), 2)))

# funtion to compute cohen's from 2 means & two sds (assuming equal n)
cd <- function(m, s) {
  stopifnot(length(m) == 2)
  stopifnot(length(s) == 2)
  d <- abs(diff(m)) / sqrt((sum(s^2))/2)
  d
}
cd(m[1:2], sd[1:2])

# loop over all combinations
out <- comb

out$d <- sapply(seq_len(nrow(comb)), function(i) {
  take <- comb[i, ]
  cd(c(m[take [[1]]], m[take[[2]]]), 
     c(sd[take[[1]]], sd[take[[2]]]))
})
out