Seite 1 von 1

Repeat Loop Problem - Error: (list) object cannot be coerced to type 'double'

Verfasst: Mo Okt 02, 2017 5:38 pm
von qigong
Hey,

ich weiß nicht, ob mein Problem in diesem Unterforum passend ist, aber ich möchte einen loop bauen, der so lamge läuft bis eine Test-Statistik (wilcox test) erfüllt ist.

Ich möchte 2 samples aus einer population ziehen. Dabei ist die Bedingung, dass ich am Ende 2 Samples erhalte, die sich nicht signifikant voneinander unterscheiden.

Das sieht man so bei mir aus:

Code: Alles auswählen

repeat {
  rm("a") #alte daten löschen
  rm("b")
  rm("df")
  rm("df1")
  df<- data.frame(sample(0:10,10000,replace=T)) #draw random population
  names(df) <- c("y") #rename 
  lapply(df, as.numeric) #benutze ich, weil ich dachte mein Problem "Error: (list) object cannot be coerced to type 'double'" lösen zu können
 
  df$ID <- seq.int(nrow(df))   #add ID column

  a <- df[sample(1:nrow(df), 1000),]   #Draw random sample from population
  lapply(a, as.numeric)

  
  df1 <- df[!(df$ID %in% a$ID),] #delete randomly drawn data from population  --> das ist quasi ziehen ohne zurücklegen, damit ich keine Duplikate in  meinen 2 samples habe
  lapply(df1, as.numeric)


  b <- df[sample(1:nrow(df), 1000),]   #Draw sample again from population
  lapply(b, as.numeric)
  if (wilcox.test(a$y,b$y) < 0.05){  #diese Bedingung soll erfüllt sein
    break
  }
}
Wenn ich es laufen lasse kommt:
Error: (list) object cannot be coerced to type 'double

Kann mir hier jemand helfen?

Grüße
Qi

Re: Repeat Loop Problem - Error: (list) object cannot be coerced to type 'double'

Verfasst: Mo Okt 02, 2017 8:02 pm
von jogo
Hallo Qi,

willkommen im Forum!
Bitte formatiere den Code in Deiner Nachricht: viewtopic.php?f=20&t=29
(... habe ich inzwischen erledigt)
Bitte lies auch den Hilfetext zu der Funktion wilcox.test()
- viele Funktionen in R liefern etwas anderes als einen einfachen Wert.
Was für ein Ergebnis eine Funktion liefert, findest Du im Hilfetext im Abschnitt Value :!:
Wenn Du den p.value des Wilcox-Tests testen wolltest, musst Du auf das passende Element im Ergebnisobjekt zugreifen:

Code: Alles auswählen

wilcox.test(a$y,b$y)$p.value < 0.05
Gruß, Jörg

Nachtrag:
Ich habe Deinen Quelltext etwas mit weiteren Kommentaren versehen:

Code: Alles auswählen

repeat {
  #rm("a") #alte daten löschen
  #rm("b")
  #rm("df")
  #rm("df1")
  rm(a, b, df, df1)
  df<- data.frame(y=sample(0:10, 10000, replace=TRUE)) #draw random population
  # names(df) <- c("y") #rename 
  # lapply(df, as.numeric) #benutze ich, weil ich dachte mein Problem "Error: (list) object cannot be coerced to type 'double'" lösen zu können
  df$ID <- seq.int(length.out=nrow(df))   #add ID column
  
  a <- df[sample(1:nrow(df), 1000),]   #Draw random sample from population
  # lapply(a, as.numeric) ### hier wird sowieso nichts gespeichert
  
  df1 <- df[!(df$ID %in% a$ID),] #delete randomly drawn data from population  --> das ist quasi ziehen ohne zurücklegen, damit ich keine Duplikate in  meinen 2 samples habe
  ### bei sample() ist replace=FALSE der Standardwert 
  ### ... und df1 wird nicht nochmal verwendet
  # lapply(df1, as.numeric) ### hier wird sowieso nichts gespeichert

  b <- df[sample(1:nrow(df), 1000),]   #Draw sample again from population
  # lapply(b, as.numeric) ### hier wird sowieso nichts gespeichert
  if (wilcox.test(a$y,b$y)$p.value < 0.05) break   # diese Bedingung soll erfüllt sein
}

### meine Version:
set.seed(42) ### für Wiederholbarkeit der Ergebnisse
y <- sample(0:10, 10000, replace=TRUE)
i <- 0
repeat {
  i <- i+1
  a <- sample(y, 1000)
  b <- sample(y, 1000)
  if (wilcox.test(a, b)$p.value < 0.05) break
}
Anschließend habe ich noch eine eigene Version programmiert
- die ist etwas Freistil, weil ich nicht weiß, was Du bezweckst (z.B. warum Du in jedem Durchlauf den Vektor y neu erzeugst).

Re: Repeat Loop Problem - Error: (list) object cannot be coerced to type 'double'

Verfasst: Di Okt 03, 2017 8:47 pm
von qigong
Hey Jörg,

danke dir! das macht Sinn. Werde das morgen gleich mal ausprobieren.

Grüße
Jan

Re: Repeat Loop Problem - Error: (list) object cannot be coerced to type 'double'

Verfasst: Di Okt 10, 2017 10:42 am
von qigong
Hey Jörg,

danke dir noch einmal für deine Tipps! Es klappt jetzt :)

Und ich muss den Vector wirklich nicht noch mal neu definieren am Anfang... Das war unnötig.

Grüße
Jan