0 votes
in Datenauswertung by s157245 (130 points)

Liebes SoSci Survey Team,

bei dem von euch bereitgestellten Skript für die D Score Berechnung des SC-IATs aus den Rohdaten (https://www.soscisurvey.de/help/doku.php/de:create:questions:iat) bekomme ich folgende Fehlermeldung:

Fehler in [<-(*tmp*, ti, , value = c(trial[1], 1)) :
Indizierung außerhalb der Grenzen

Über das Debugging konnte ich feststellen, dass der Fehler innerhalb dieser Schleife liegt (die Schleife läuft nicht komplett durch):

      for (bi in 1:length(b)) {
        bis = as.character(bi)
        bv[[bis]] = matrix(nrow=0, ncol=2);

        for (ti in 1:nrow(b[[bis]])) {
            trial = b[[bis]][ti,];
            # "Responses less than 350 ms were eliminated"
            if (trial[1] < 350) {
                next;
            }
            # "nonresponses were eliminated"
            if (trial[2] == 2) {
                next;
            }
            # otherwise use
            bv[[bis]] = rbind(bv[[bis]], trial);
        }
        # "error responses were replaced with the block mean plus an error penalty of 400 ms."
        # Need the block mean
        # Note: Assume that the block mean is computed on all responses (incl. fails but excl. nonresponses and <350 ms)
        times = computeTimes(bv[[bis]]);
        meanTime = computeMean(times);
        bc[[bis]] = matrix(nrow=0, ncol=2);
        for (ti in 1:nrow(bv[[bis]])) {
            trial = bv[[bis]][ti,];
            if (trial[2] == 0) {
                bc[[bis]][ti,] = c(meanTime + 400, 0);
            } else {
                bc[[bis]][ti,] = c(trial[1], 1);
            }
        }
    }
    

Ich bin sehr dankbar über jede Hilfe!

by SoSci Survey (327k points)
> Indizierung außerhalb der Grenzen

Das könnte bedeuten, dass trial leer ist. Was passiert denn, wenn Sie vor das IF noch ein paar Zeilen Debugging-Code setzen?

print(trial);
print(trial[1]);
if (trial[1] < 350)
by s157245 (130 points)
Dann passiert folgendes:
computeScIAT(data$IM01i0)
[1] 557   1
[1] 557
[1] 588   1
[1] 588
[1] 599   1
[1] 599
[1] 620   1
[1] 620
[1] 560   1
[1] 560
[1] 579   1
[1] 579
[1] 561   1
[1] 561
[1] 498   1
[1] 498
[1] 492   1
[1] 492
[1] 536   1
[1] 536
[1] 567   1
[1] 567
[1] 546   1
[1] 546
[1] 567   1
[1] 567
[1] 494   1
[1] 494
[1] 717   1
[1] 717
[1] 521   1
[1] 521
[1] 505   1
[1] 505
[1] 557   1
[1] 557
[1] 519   1
[1] 519
[1] 541   1
[1] 541
[1] 622   0
[1] 622
[1] 583   1
[1] 583
[1] 622   1
[1] 622
[1] 867   1
[1] 867
Fehler in `[<-`(`*tmp*`, ti, , value = c(trial[1], 1)) :
  Indizierung außerhalb der Grenzen
1: computeScIAT(data$IM01i0)
by SoSci Survey (327k points)
Danke. Dann entsteht das Problem wohl eher in dieser Zeile hier:

bc[[bis]][ti,] = c(trial[1], 1);

Womöglich ist eine neuere R-Version da strenger als jene, unter welcher das Script urspringlich erstellt wurde.

Suchen Sie bitte ein paar Zeilen weiter oben folgende Zeile:

bc[[bis]] = matrix(nrow=0, ncol=2);

Ändern Sie hier das nrow wie folgt:

bc[[bis]] = matrix(nrow=nrow(bv[[bis]]), ncol=2);
by s157245 (130 points)
Schon mal vielen Dank für die Hilfe!
Nach Änderung dieser Zeile, bekomme ich folgende Fehlermeldung:

> computeScIAT(data$IM01i0)
[1] 557   1
[1] 557
[1] 588   1
[1] 588
[1] 599   1
[1] 599
[1] 620   1
[1] 620
[1] 560   1
[1] 560
[1] 579   1
[1] 579
[1] 561   1
[1] 561
[1] 498   1
[1] 498
[1] 492   1
[1] 492
[1] 536   1
[1] 536
[1] 567   1
[1] 567
[1] 546   1
[1] 546
[1] 567   1
[1] 567
[1] 494   1
[1] 494
[1] 717   1
[1] 717
[1] 521   1
[1] 521
[1] 505   1
[1] 505
[1] 557   1
[1] 557
[1] 519   1
[1] 519
[1] 541   1
[1] 541
[1] 622   0
[1] 622
[1] 583   1
[1] 583
[1] 622   1
[1] 622
[1] 867   1
[1] 867
[1] 744   1
[1] 744
[1] 519   1
[1] 519
[1] 659   1
[1] 659
[1] 604   1
[1] 604
[1] 589   1
[1] 589
[1] 596   1
[1] 596
[1] 522   1
[1] 522
[1] 659   1
[1] 659
[1] 515   1
[1] 515
[1] 703   1
[1] 703
[1] 552   1
[1] 552
[1] 581   1
[1] 581
[1] 539   1
[1] 539
[1] 592   1
[1] 592
[1] 728   1
[1] 728
[1] 503   1
[1] 503
[1] 571   1
[1] 571
[1] 547   1
[1] 547
[1] 621   1
[1] 621
[1] 746   1
[1] 746
[1] 596   1
[1] 596
[1] 754   0
[1] 754
[1] 552   1
[1] 552
[1] 578   1
[1] 578
[1] 602   1
[1] 602
[1] 618   1
[1] 618
[1] 547   1
[1] 547
[1] 632   1
[1] 632
[1] 502   1
[1] 502
[1] 556   1
[1] 556
[1] 645   0
[1] 645
[1] 561   1
[1] 561
[1] 650   1
[1] 650
[1] 583   1
[1] 583
[1] 642   1
[1] 642
[1] 751   1
[1] 751
[1] 567   1
[1] 567
[1] 577   1
[1] 577
[1] 545   1
[1] 545
[1] 820   1
[1] 820
[1] 551   0
[1] 551
[1] 564   1
[1] 564
[1] 628   0
[1] 628
[1] 1250    1
[1] 1250
[1] 690   1
[1] 690
[1] 477   0
[1] 477
[1] 931   1
[1] 931
[1] 588   1
[1] 588
[1] 768   1
[1] 768
[1] 520   0
[1] 520
[1] 881   1
[1] 881
[1] 559   1
[1] 559
[1] 548   1
[1] 548
[1] 593   1
[1] 593
[1] 988   1
[1] 988
[1] 814   1
[1] 814
[1] 665   1
[1] 665
[1] 726   1
[1] 726
[1] 729   1
[1] 729
[1] 541   1
[1] 541
[1] 861   1
[1] 861
[1] 581   1
[1] 581
[1] 639   0
[1] 639
[1] 812   1
[1] 812
[1] 610   1
[1] 610
[1] 780   1
[1] 780
[1] 709   1
[1] 709
[1] 795   1
[1] 795
[1] 587   0
[1] 587
[1] 890   1
[1] 890
[1] 607   1
[1] 607
[1] 651   1
[1] 651
[1] 640   0
[1] 640
[1] 981   1
[1] 981
[1] 840   1
[1] 840
[1] 648   1
[1] 648
[1] 682   1
[1] 682
[1] 743   1
[1] 743
[1] 677   1
[1] 677
[1] 617   1
[1] 617
[1] 858   1
[1] 858
[1] 603   1
[1] 603
[1] 769   1
[1] 769
[1] 595   1
[1] 595
[1] 1037    1
[1] 1037
[1] 969   1
[1] 969
[1] 704   1
[1] 704
[1] 591   1
[1] 591
[1] 757   1
[1] 757
[1] 556   1
[1] 556
[1] 591   1
[1] 591
[1] 655   1
[1] 655
[1] 482   1
[1] 482
[1] 532   0
[1] 532
[1] 964   0
[1] 964
[1] 876   1
[1] 876
[1] 795   1
[1] 795
[1] 811   1
[1] 811
[1] 555   1
[1] 555
[1] 904   1
[1] 904
[1] 749   0
[1] 749
[1] 671   1
[1] 671
[1] 769   1
[1] 769
[1] 898   1
[1] 898
[1] 832   1
[1] 832
[1] 607   1
[1] 607
[1] 763   1
[1] 763
[1] 549   1
[1] 549
[1] 647   1
[1] 647
[1] 894   1
[1] 894
[1] 700   1
[1] 700
[1] 787   1
[1] 787
[1] 532   1
[1] 532
[1] 971   1
[1] 971
[1] 558   0
[1] 558
[1] 1282    1
[1] 1282
[1] 611   1
[1] 611
[1] 1091    1
[1] 1091
[1] 563   1
[1] 563
[1] 638   1
[1] 638
 Fehler in 1:nrow(a) : Argument der Länge 0

Als Debug location werden mir diese Zeilen angezeigt:

function(a) {
        r = c();
        for (i in 1:nrow(a)) {
            if (a[i,1] == F) {
                r[i] = F;
            } else {
                r[i] = a[i,1];
            }
        }
        return(r);
    }

1 Answer

0 votes
by SoSci Survey (327k points)

Ich glaube, die beiden print()-Zeilen können Sie wieder aus dem Code nehmen :)

Die im Fehler gemeldete Funktion sollte computeTimes sein. Offenbar wird da ein leeres Argument geliefert.

Schreiben Sie direkt vor diese Zeile

times = computeTimes(bv[[bis]]);

Doch bitte einmal neuen Debug-Code.

print(bis)
print(str(bv[[bis]]))
times = computeTimes(bv[[bis]])

Tasten wir uns langsam vorn...

by s157245 (130 points)
Tausend Dank für die ganze Hilfe!
Ich habe den neuen Debug-Code hinzugefügt und bekomme folgende Fehlermeldung:

> computeScIAT(data$IM01i0)
[1] "1"
 int [1:24, 1:2] 557 588 599 620 560 579 561 498 492 536 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:24] "trial" "trial" "trial" "trial" ...
  ..$ : NULL
NULL
[1] "2"
 int [1:24, 1:2] 744 519 659 604 589 596 522 659 515 703 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:24] "trial" "trial" "trial" "trial" ...
  ..$ : NULL
NULL
[1] "3"
 int [1:24, 1:2] 602 618 547 632 502 556 645 561 650 583 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:24] "trial" "trial" "trial" "trial" ...
  ..$ : NULL
NULL
[1] "4"
 int [1:24, 1:2] 768 520 881 559 548 593 988 814 665 726 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:24] "trial" "trial" "trial" "trial" ...
  ..$ : NULL
NULL
[1] "5"
 int [1:24, 1:2] 640 981 840 648 682 743 677 617 858 603 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:24] "trial" "trial" "trial" "trial" ...
  ..$ : NULL
NULL
[1] "6"
 int [1:24, 1:2] 795 811 555 904 749 671 769 898 832 607 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:24] "trial" "trial" "trial" "trial" ...
  ..$ : NULL
NULL
 Fehler in 1:nrow(a) : Argument der Länge 0


Mit derselben Debug location:
function(a) {
        r = c();
        for (i in 1:nrow(a)) {
            if (a[i,1] == F) {
                r[i] = F;
            } else {
                r[i] = a[i,1];
            }
        }
        return(r);
    }
by SoSci Survey (327k points)
Das sieht sauber aus. Dann ist es wohl doch die andere Stelle, wo computeTimes() verwendet wird. Bitte entfernen Sie den gerade eingefügten Code und ergänzen Sie stattdessen an anderer Stelle:

computeDScore = function(b2, b4) {
        str(b2)
        str(b4)
        times2 = computeTimes(b2);
        times4 = computeTimes(b4);

und außerdem:

str(b2)
str(b4)
str(bc)
res[cs, "SC.D"] = computeDScore(b2, b4);
by s157245 (130 points)
Dann bekomme ich folgende Fehlermeldung:

> computeScIAT(data$IM01i0)
 num [1:72, 1:2] 557 588 599 620 560 579 561 498 492 536 ...
 num [1:72, 1:2] 768 1102 881 559 548 ...
List of 6
 $ 1: num [1:24, 1:2] 557 588 599 620 560 579 561 498 492 536 ...
 $ 2: num [1:24, 1:2] 744 519 659 604 589 596 522 659 515 703 ...
 $ 3: num [1:24, 1:2] 602 618 547 632 502 ...
 $ 4: num [1:24, 1:2] 768 1102 881 559 548 ...
 $ 5: num [1:24, 1:2] 1124 981 840 648 682 ...
 $ 6: num [1:24, 1:2] 795 811 555 904 1157 ...
 num [1:72, 1:2] 557 588 599 620 560 579 561 498 492 536 ...
 num [1:72, 1:2] 768 1102 881 559 548 ...
List of 1
 $ 1: num [1:24, 1:2] 557 588 599 620 560 579 561 498 492 536 ...
List of 1
 $ 4: num [1:24, 1:2] 768 1102 881 559 548 ...
 Fehler in 1:nrow(a) : Argument der Länge 0
by SoSci Survey (327k points)
Hmmm ... da ist nirgendwo ein "Argument der Länge 0" zu entdecken. Ich vermute, Sie kenne nicht zufällig die Funktion in R, wo man sich den Stack des Fehlers anzeigen lassen kann?

Möchten Sie mir Ihre Daten einfach mal an info@soscisurvey.de senden, damit ich direkt einen Blick darauf werfen kann?
by s157245 (130 points)
Wenn ich mir den Stack über traceback() ausgeben lassen, bekomme ich Folgendes:

> traceback()
3: computeTimes(b2) at #12
2: computeDScore(bc[1], bc[4]) at #166
1: computeScIAT(data$IM01i0)

Ich schicke Ihnen auch gerne ein Mail mit den Daten dazu! :)
by SoSci Survey (327k points)
Der Stack bestätigt nur die Vermutung, dass wir eigentlich schon an der richtigen Stelle geschaut haben. Beruhigend, hilft uns aber auch nicht weiter. Denn die Zahlenreihen für die Teil-Abschnitte 1 und 4 sehen auf den ersten Blick auch korrekt aus.

> Ich schicke Ihnen auch gerne ein Mail mit den Daten dazu! :)

Notieren Sie gerne auch Ihre R-Version in die E-Mail. Danke.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...