Über Funktionsschleife Werte erzeugen für Referenztabelle

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

Moderatoren: EDi, jogo

produnis
Beiträge: 3
Registriert: Di Mär 23, 2021 10:41 am

Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von produnis »

Hallo miteinander,
ich habe eine "Frage" zu R

Ich würde gerne folgende Referenztabellen mit R erstellen - also, ich möchte deren Werte berechnen. Die Tabelle mach ich dann in LaTeX schön.
Bild

In R kann man Fallzahlen in Abhängigkeit von Power, Effekt und Alpha mit dem pwr-Paket rechnen.

Code: Alles auswählen

library(pwr)
# gib Fallzahl für d=0.5; power=0.8 und alpha=0.05 aus
pwr.t.test(d=0.50, sig.level=0.05, power=0.80, type="two.sample", alternative="two.sided")

# zeige nur die Fallzahl
pwr.t.test(d=0.50, sig.level=0.05, power=0.80, type="two.sample", alternative="two.sided")$n
Um jetzt die Werte der Tabelle "in einem Rutsch" zu erzeugen, habe ich eine kleine Funktion geschrieben (bitte nicht lachen :) )

Code: Alles auswählen

powertabelle <- function(d,power,alpha){
  # erstelle Dummy x, damit c() funktioniert
  x <- 0
  # gehe für alle werte in power durch
  for(power2 in power){
    # gehe alle Werte in d durch
    for(d2 in d)  {
      # Berechne die Fallzahl für alle d2 mit power2
      x <- c(x, round(pwr.t.test(d=d2, sig.level=alpha, power=power2, type="two.sample", alternative="two.sided")$n,0))
    }  
  }
  # entferne Dummy-Eintrag
  x <- x[-1]
  # stelle den Wertevector als Matrix mit d*power Spalten/Zeilen
  x <- matrix(x,nrow=length(power),ncol=length(d),byrow=TRUE)
  # übergebe die Matrix in ein Dataframe
  x <- data.frame(x)
  # benenne die Spalten
  colnames(x) <- d
  # benenne die Zeilen
  row.names(x)<- power
  # gebe das fertige Dataframe zurück
  return(x)
}
mit folgenden weiteren Variablen rufe ich dann diese Funktion auf

Code: Alles auswählen

d <- seq(from=0.1,to=0.8,by=0.05)
power <- c(seq(0.6,0.9,0.1),0.95, 0.99)

# rufe damit die Funktion auf
# erzeuge Tabelle für alpha = 0.05
powertabelle(d,power,0.05)

Das funktioniert wie gesagt ganz gut.
Meine Frage ist:
gibt es einen eleganteren Weg, diese Datenreihen zu erzeugen?
Grade das "Dummy-X" in der Funktion stört mich, das sieht so hingepfuscht aus, wenn man dummys anlegen und hinterher wieder löschen muss...

Ich bin dankbar für jede Rückmeldung,

beste Grüße
P
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von Athomas »

Ich habs nur überflogen - aber das sieht wieder nach einem Fall für "outer()" aus!?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von EDi »

Für mich ein Fall für funktionelle Programmierung:

Code: Alles auswählen

# create scenarious to compute
scen <- expand.grid(alpha = c(0.05, 0.01),
  d = seq(from = 0.1, to = 0.8, by = 0.05),
  power = c(seq(0.6, 0.9, 0.1), 0.95, 0.99)
  )

 

# function to compute power for a given combo

pwr <- function(alpha, d, power) {
  round(pwr::pwr.t.test(d = d, sig.level = alpha, power = power,
    type = "two.sample", alternative = "two.sided")$n)
}

 

library(purrr)
library(dplyr)

# compute power for each combo

scen %>%
  mutate(n = pmap_dbl(scen, pwr))

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.
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von bigben »

Und wenn man die Idee von EDi und seine Variable scen und seine Funktion pwr übernehmen aber ohne purr und dplyr auskommen will geht auch

Code: Alles auswählen

scen$n <- apply(scen, 1, function(line) pwr(line["alpha"], line["d"], line["power"]))
head(scen, 20)
Die gewünschten Tabellen werden dann durch Umwandlung ins weite Format daraus:

Code: Alles auswählen

subset05 <- subset(scen, alpha == .05)
tabelle05 <- reshape(subset05, v.names = "n", timevar = "d", 
                     idvar = "power", direction = "wide")
print(tabelle05)

subset01 <- subset(scen, alpha == .01)
tabelle01 <- reshape(subset01, v.names = "n", timevar = "d", 
                     idvar = "power", direction = "wide")
print(tabelle05)
Latex wird daraus z. B. mit der Funktion xtable aus dem gleichnamigen Paket:

Code: Alles auswählen

> library(xtable)
> xtable(tabelle05)
% latex table generated in R 4.0.1 by xtable 1.8-4 package
% Tue Mar 23 12:51:05 2021
\begin{table}[ht]
\centering
\begin{tabular}{rrrrrrrrrrrrrrrrrr}
  \hline
 & alpha & power & n.0.1 & n.0.15 & n.0.2 & n.0.25 & n.0.3 & n.0.35 & n.0.4 & n.0.45 & n.0.5 & n.0.55 & n.0.6 & n.0.65 & n.0.7 & n.0.75 & n.0.8 \\ 
  \hline
1 & 0.05 & 0.60 & 981.00 & 436.00 & 246.00 & 158.00 & 110.00 & 81.00 & 62.00 & 49.00 & 40.00 & 33.00 & 28.00 & 24.00 & 21.00 & 18.00 & 16.00 \\ 
  31 & 0.05 & 0.70 & 1235.00 & 550.00 & 310.00 & 198.00 & 138.00 & 102.00 & 78.00 & 62.00 & 50.00 & 42.00 & 35.00 & 30.00 & 26.00 & 23.00 & 20.00 \\ 
  61 & 0.05 & 0.80 & 1571.00 & 699.00 & 393.00 & 252.00 & 175.00 & 129.00 & 99.00 & 78.00 & 64.00 & 53.00 & 45.00 & 38.00 & 33.00 & 29.00 & 26.00 \\ 
  91 & 0.05 & 0.90 & 2102.00 & 935.00 & 526.00 & 337.00 & 234.00 & 173.00 & 132.00 & 105.00 & 85.00 & 70.00 & 59.00 & 51.00 & 44.00 & 38.00 & 34.00 \\ 
  121 & 0.05 & 0.95 & 2600.00 & 1156.00 & 651.00 & 417.00 & 290.00 & 213.00 & 163.00 & 129.00 & 105.00 & 87.00 & 73.00 & 62.00 & 54.00 & 47.00 & 42.00 \\ 
  151 & 0.05 & 0.99 & 3675.00 & 1634.00 & 920.00 & 589.00 & 409.00 & 301.00 & 231.00 & 182.00 & 148.00 & 122.00 & 103.00 & 88.00 & 76.00 & 66.00 & 58.00 \\ 
   \hline
\end{tabular}
\end{table}
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
produnis
Beiträge: 3
Registriert: Di Mär 23, 2021 10:41 am

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von produnis »

Vielen Dank Edi und Bernhard,
das hilft mir weiter!!!
Danke!!!!
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von EDi »

Und wenn man die Idee von EDi und seine Variable scen und seine Funktion pwr übernehmen aber ohne purr und dplyr auskommen will geht auch
In dem Fall ist apply genauso elegant & lesbar.
In dem Fall hier, muss man aber etwas von der Funktionsweise von pmap kennen (man hätte die argument auch explizit übergeben können, wie im apply Beispiel). mutate() ist nicht nötig für einen simulationsschritt.

Für komplexere Simulationen (komplexere Objekte, geschachtelte Funktionen, parallelisierung,....) empfinde ich das tidyverse angenehmer mit zu arbeiten. Der Code wirkt lesbarer und aufgeräumter. Mit furrr kann man mit identischen (!) code parallel oder sogar remote (z.b. auf einem HPC cluster) rechnen.
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.
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von bigben »

Hallo EDi,

es steht ja nirgends geschrieben, dass eine Statistiksprache im 21. Jahrhundert nicht besser werden kann als im 20. Jahrhundert. Was mich an der ganzen Tidyverse-Entwicklung stört ist die Sprachverwirrung die entsteht, wenn man für jede Basisfunktion von R ein neues Verb erfindet und die dann solchermaßen einmal komplett ausgetauschte Sprache dann weiterhin R nennt. Es entstehen am Ende zwei Gruppen: die eine schaut ihre data.frames mit str an und rechnet einen t.test, die andere schaut Ihr tibble mit glimpse an und rechnet einen t_test. Wenn man die neue Sprache R++ nennen würde, dann wäre vieles einfacher.

Kürzlich hatte hier jemand ein Buch auf dem Schreibtisch liegen, das ich nicht kannte: R für Dummies. Ich musste es aufschlagen und herumblättern um zu erfahren, ob es Klassisch-R oder Neu-R lehrt. Vom Cover war nicht zu erkennen, welche Sprache Gegenstand des Buches ist!

Stell Dir vor, der OP lernt klassisches R und fragt hier, wie er eine Serienberechnung eleganter als mit seiner for-Schleife machen kann. Dann wäre es doch maximal irreleitend ihm zu antworten, dass man dafür in R Zusatzpakete nimmt, die in seinem Unterricht/seinem Buch nie mehr auftauchen. Ganz anders, wenn der OP in tidyverse ausgebildet wird. Dann soll er meinetwegen sofort die Gleichsetzung von funktionaler Programmierung und purr lernen. Leider ist es nicht so, dass die einen hier ankommen und verkünden, dass sie neu in R sind und die anderen kommen und sagen, dass sie neu in R++ sind. Deshalb war es mir wichtig dem Anfänger zu antworten, dass man auch in Alt-R Alternativen zur for-Schleife hat. Ich glaube, dass wir noch eine ganze Zeit lang auf solche Fragen mehrere verschiedene Antworten geben sollten.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von Athomas »

Wenn man die neue Sprache R++ nennen würde, dann wäre vieles einfacher.
Auch wenn ich damit dem Ernst der Frage (wieder mal) nicht gerecht werde: es gibt in meinen Augen zwei natürliche Kandidaten für den Namen der neuen Sprache:
  • T - für "Tidy" und
  • H - für "Hadley"
Zuletzt geändert von Athomas am Mi Mär 24, 2021 11:17 am, insgesamt 1-mal geändert.
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von bigben »

@Athomas: Sorry, jetzt hatte ich versehentlich Deinen Beitrag überschrieben, statt zu antworten. Ich bin da unschlüssig.

Einerseits sind alle Einzelbuchstaben als Programmiersprachennamen schon vergeben: https://beza1e1.tuxen.de/one_letter_proglangs.html

Andererseits hatte Hadley in der Vergangenheit ja keine Probleme damit, wenn ein Name schon vergeben war.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Über Funktionsschleife Werte erzeugen für Referenztabelle

Beitrag von Athomas »

sind alle Einzelbuchstaben als Programmiersprachennamen schon vergeben
Dann sagen wir halt, es wären griechische Buchstaben und sprechen es als "Tau" bzw. "Eta" aus...
Antworten