Ergebnisse einer Schleife (Faktorenanalysen) in ein PDF schreiben

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
codecook
Beiträge: 4
Registriert: Sa Nov 20, 2021 11:16 am

Ergebnisse einer Schleife (Faktorenanalysen) in ein PDF schreiben

Beitrag von codecook »

Hallo, liebes Forum! (:

Ich arbeite gerade für ein Forschungsprojekt an einem öffentlichen Forschungsinstitut an einer Syntax, die für einen gegebenen Datensatz sämtliche Arten an Faktorenanalysen automatisiert durchführt. Bis dahin klappt auch alles, weil es nicht so komplex ist und es sich nur um eine Schleife handelt, die dem fa()-Befehl in jedem Schleifendurchlauf andere Parameter übergibt. Ich würde aber gerne den Output, genau genommen die Matrix mit den rotierten Faktorladungen, in einem PDF-Dokument speichern, um später bequem die Ergebnisse durchzusehen und ggf. an Kolleginnen und Kollegen weiterzureichen.

Genau das gleiche habe ich schon mit anderen Berechnungen hinbekommen. Z.b. konnte ich erfolgreich mittels einer Schleife, dem pdf()-Befehl und dev.off() die Histogramme von hunderten von Merkmalen automatisiert mittels einer Schleife in ein PDF speichern. Was die Faktorenanalyse angeht (Output ist ja ein Text, kein Bild) hat das aber nicht geklappt. Im Netz habe ich nur eine Anleitung gefunden, wie ich das Log in eine txt-Datei speichern kann, was schon mal gut ist, aber noch nicht genau das, was ich mr vorstelle, weil ich diese Logfiles nochmal deutlich überarbeiten muss, damit wirklich nur das wichtigste drin steht.

Hier ein reproduzierbarer Code:


Beispieldaten und Pakete laden:

Code: Alles auswählen

# Pakete 
library(psy)
library(psych)
library(GPArotation)

# Daten
data(bfi)
bfi <- bfi[, 1: 25]
bfi <- bfi[complete.cases(bfi),]

Hier ein paar Variablen zur Konfiguration der Faktorenanalyse

Code: Alles auswählen

# config
fac_n <- 5
cutoff_lvl <- 0.3
digits_lvl <- 2

Das sind die verschiedenen Rotationsmethoden, von denen fa() in jedem Schleifendurchlauf eine andere erhält.

Code: Alles auswählen

r_methods = c("none", "varimax", "quartimax", "bentlerT", "equamax", "varimin", "geominT", "bifactor", "promax", "oblimin", "bentlerQ", "geominQ", "biquartimin")
Das wäre dann eine Schleife, die die Ergebnisse einfach in die Konsole ausgibt. Funktioniert auch wunderbar. Sys.sleep() ist natürlich optionale.

Code: Alles auswählen

for(method in r_methods){
  print(method)
  analysis <- factanal(bfi, fac_n, rotation=method)
  print(analysis$loadings,
        cutoff = cutoff_lvl,
        digits = digits_lvl)
  Sys.sleep(1) # optional
}

Und das hier ist die Schleife, mit der ich das ganze in einPDF-File ausgeben lassen wollte. Es werden tatsächlich PDF-Dateien erstellt, aber die sind Müll.

Code: Alles auswählen

############################################################
# PDF-Methode
############################################################


subdir <- "/Results"                                        # Unterordner für die Ergebnisse
dir.create( paste0(getwd(), subdir) , showWarnings = FALSE) # Ordner erstellen
oldwd <- getwd()                                            # Alte Workingdirectory speichern
setwd(paste0(getwd(), subdir))                              # neue workingdirectory in den Unterordner Results

for(method in r_methods){
  pdf(paste0(method, "_loadings.pdf"), paper="a4")      # create pdf
  plot.new()                                            # create plot even if it is no plot
  analyse  <- factanal(bfi, fac_n, rotation=method)     # calculate factoranalysis
  ladungen <- print(analyse$loadings,
                    cutoff = cutoff_lvl,
                    digits = digits_lvl)
  text(x=0, labels = ladungen)                          # print object
  dev.off()                                             # close pdf
}
setwd(oldwd)                                            # alte wd wiederherstellen



Ich nehme an, dass das Problem am text() Befehl liegt und ich ihn falsch spezifiziere oder dass er gänzlich ungeeignet ist und ich einen anderen Befehl benötige. Hat jemand Ideen?

Vielen Dank im voraus!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Ergebnisse einer Schleife (Faktorenanalysen) in ein PDF schreiben

Beitrag von bigben »

Hallo codecook,

es gibt zwei sehr verschiedene Ansätze, die da sinnvoll erscheinen. Das erfordert eine Grundsatzentscheidung. Mit dem Paketen knitr und rmarkdown kannst Du umfangreiche Berichte als mehrseitiges PDF erstellen. Du kannst damit die Ergebnisse aller Berechnungen, die Grafiken, Tabellen etc in einem Dokument, gerne auch mit verlinktem Inhaltsverzeichnis und mehreren Überschriftenebenen und so weiter verpacken und dann dieses eine Dokument mit deinen Partnern teilen. Man muss sich da etwas eindenken und Umstellen, aber die Ergebnisse sind wirklich gut und man zwingt sich zu reproduzierbarem Code und überhaupt. Nahezu alles, was ich mit anderen Leuten gemeinsam mache, lebt in RMarkdown-Files. Deshalb glaube ich, dass es den Aufwand mehr als Wert ist, sich in RMarkdown einzuleben.

Es gibt Unmengen richtig guter Anleitungen im Netz. Ein möglicher Einstieg ins Thema ist das hier: https://rmarkdown.rstudio.com/lesson-1.html
Sehr empfehlenswert als Referenz danach ist das Cookbook unter https://bookdown.org/yihui/rmarkdown-cookbook/

Du kannst natürlich auch bei Deinem Ansatz bleiben, jede Grafik als einzelnes PDF zu erstellen und musst Dir dann überlegen, wie Du die vielen PDF ordnest und den Überblick behälst. Einfach mit text in eine Grafik zu schreiben geht im Grundsatz:

Code: Alles auswählen

plot.new()
for(i in (0:9)/10) text(i, i, paste0("Hallo_", i))
Aber ganz ehrlich, gut ist das nicht. Schriftsatz wird sehr schnell sehr kompliziert und es gibt Seitenränder, Umbrüche und dergleichen. Dafür ist die text Funktion nicht gemacht. Es gibt aber einige excellente Pakete, um Tabellen grafisch ansprechend darzustellen und letztlich kann man ja aus Texten und Matrizen immer auch eine Tabelle machen. Auch das wird ein wenig Einarbeitungszeit kosten, erfordert aber sonst keine Änderungen in Deinem Programmierablauf. Und Du erhälst sehr mächtige Werkzeuge zum Erstellen von präsentiertauglichem Material.
Das flextable Paket sollte dafür infrage kommen. Eine ausführliche Anleitung gibt es hier: https://ardata-fr.github.io/flextable-book/
Das Kapitel zum Exportieren in Grafikformate findet man hier: Exporte in PDF scheinen ein wenig komplizierter als Exporte nach PNG zu sein, aber das wird sich irgendwie finden: https://ardata-fr.github.io/flextable-b ... ple-export (vielleicht ein Umweg über die Funtkionen in Kapitel 3.5.3 oder 3.5.4?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
codecook
Beiträge: 4
Registriert: Sa Nov 20, 2021 11:16 am

Re: Ergebnisse einer Schleife (Faktorenanalysen) in ein PDF schreiben

Beitrag von codecook »

Danke, Bernhard, für deine ausführliche Antwort!

Mit RMarkdowns habe ich mich letztes Semester in einem Uni-Kurs herumschlagen müssen. Ich hielt die Markdownsyntax (zumindest als R-Einsteiger) allerdings für so dermaßen nervig, dass ich mittlerweile Jupyter Notebooks (mit R-Plugin) verwende. Mit Jupyter Notebooks kann man das gleiche erledigen, wie mit R-Markdown, nur dass im Hintergrund (meines Wissens) eine andere Syntax arbeitet. Dafür kann man ganz leicht zwischen PYthon und R hin und her switchen, ohne eine komplett andere Umgebung verwenden zu müssen. Aber auch in PyCharm, was ich viel lieber als RStudio verwende, kann man meines Wissens auch an Markdowns oder Jupyter Notebooks arbeiten.

Dass man Markdowns auch automatisert erstellen kann, habe ich gar nicht bedacht. Ich habe sie immer nur verwendet, um Ergebnisse mehr oder weniger händisch niederzuschreiben. Danke für den Tipp!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Ergebnisse einer Schleife (Faktorenanalysen) in ein PDF schreiben

Beitrag von bigben »

Hi,

ich habe keine Erfahrung mit Jupyter, PyCharm oder dem Kombinieren von Python und R, deshalb kann ich da nicht mitreden. Wenn Du einen so großen Werkzeugkasten zur Verfügung hast, können sich da natürlich weitere Lösungswege auftun.
Wenn Du bei RMarkdown gegen Syntax kämpfen musstest wäre mein erster Verdacht, dass RMarkdown in dem Kurs vielleicht merkwürdig vermittelt wurde.
Dass man Markdowns auch automatisert erstellen kann, habe ich gar nicht bedacht.
Wahrscheinlich meinen wir das Gleiche, nur nochmal zur Sicherheit: Ich würde nicht mehrere Markdowndokumente erstellen, sondern in einem Markdowndokument mehrere Ergebnisse darstellen. Das geht beispielsweise auch in Schleifen.

Viel Erfolg,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten