Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Antworten
8ZRbP
Beiträge: 60
Registriert: Do Okt 13, 2016 11:56 am

Cohens d bei sehr vielen Gruppen? package/Funktion gesucht

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag von jogo »

Vielleicht kannst Du ja dies nutzen:
https://stackoverflow.com/questions/154 ... ffect-size
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

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

Beitrag 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 ;)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
8ZRbP
Beiträge: 60
Registriert: Do Okt 13, 2016 11:56 am

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

Beitrag 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
8ZRbP
Beiträge: 60
Registriert: Do Okt 13, 2016 11:56 am

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

Beitrag 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.
8ZRbP
Beiträge: 60
Registriert: Do Okt 13, 2016 11:56 am

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

Beitrag 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! :)
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

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

Beitrag 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...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
8ZRbP
Beiträge: 60
Registriert: Do Okt 13, 2016 11:56 am

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

Beitrag 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
Antworten