2016-05-26 6 views
0

Meine Eingabedatei:Variable Längen unterscheiden sich in R (lineare Modellierung mit lme4)

 
Treat1 Treat2 Batch gene1 gene2 
High Low  1  92.73 4.00 
Low  Low  1  101.85 6.00 
High High 1  136.00 4.00 
Low  High 1  104.00 3.00 
High Low  2  308.32 10.00 
Low  Low  2  118.93 3.00 
High High 2  144.47 3.00 
Low  High 2  189.66 4.00 
High Low  3  95.12 2.00 
Low  Low  3  72.08 6.00 
High High 3  108.65 2.00 
Low  High 3  75.00 3.00 
High Low  4  111.39 5.00 
Low  Low  4  119.80 4.00 
High High 4  466.55 11.00 
Low  High 4  125.00 3.00 

Es gibt Zehntausende von zusätzlichen Spalten, die jeweils mit einem Header und einer Liste von Zahlen, gleiche Länge wie „gene1“ Säule.

Mein Code:

library(lme4) 
library(lmerTest) 

# Import the data. 
mydata <- read.table("input_file", header=TRUE, sep="\t") 

# Make batch into a factor 
mydata$Batch <- as.factor(mydata$Batch) 

# Check structure 
str(mydata) 

# Get file without the factors, so that names(df) gives gene names. 
genefile <- mydata[c(4:2524)] 

# Loop through all gene names and run the model once per gene and print to file. 
for (i in names(genefile)){ 
    lmer_results <- lmer(i ~ Treat1*Treat2 + (1|Batch), data=mydata) 
    lmer_summary <- summary(lmer_results) 
    write(lmer_summary,file="results_file",append=TRUE, sep="\t", quote=FALSE) 
} 

Struktur:

'data.frame':  16 obs. of 2524 variables: 
$ Treat1   : Factor w/ 2 levels "High","Low": 1 2 1 2 1 2 1 2 1 2 ... 
$ Treat2   : Factor w/ 2 levels "High","Low": 2 2 1 1 2 2 1 1 2 2 ... 
$ Batch   : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 2 2 2 2 3 3 ... 
$ gene1   : num 92.7 101.8 136 104 308.3 ... 
$ gene2   : num 4 6 4 3 10 3 3 4 2 6 ... 

Meine Fehlermeldung:

Fehler bei model.frame.default (data = mydata, Tropfen .unused.levels = TRUE, Formel = i ~: variable Längen unterscheiden Calls (für 'Treat1' gefunden): -> eval - lmer ...> eval -> -> model.frame.default Execution

gestoppt

Ich habe versucht, alle Objekte zu untersuchen beteiligt und kann keine Unterschiede in den variablen Längen sehen, und ich habe auch sichergestellt, dass keine Daten fehlen. Wird na.exclude ausgeführt, ändert sich nichts.

Irgendeine Idee von was ist los?

+0

Ein Ausgangspunkt für Sie ist, eine Druckanweisung hinzuzufügen, um herauszufinden, welche Spalte das Problem verursacht. Da wir Ihre Daten nicht haben, kann es sehr schwierig sein, das Problem zu diagnostizieren. – lmo

+5

Sie haben in Ihren Daten keine Spalte "i". Daher sieht "lmer" außerhalb der Daten und findet den Zeichenvektor "i". Versuchen Sie 'lmer_results <- lmer (as.formula (paste0 (i," ~ Treat1 * Treat2 + (1 | Batch) ")), data = mydata)' – Roland

Antwort

2

@ Rolands Diagnose (lmer sucht eine variable i, nicht eine Variable, deren Namen genannt ist i: Pflicht Lewis Carroll reference) korrekt ist, glaube ich. Die unmittelbarste Art und Weise zu handhaben mit reformulate() wäre, so etwas wie:

for (i in names(genefile)){ 
    form <- reformulate(c("Treat1*Treat2","(1|Batch)"),response=i) 
    lmer_results <- lmer(form, data=mydata) 
    lmer_summary <- summary(lmer_results) 
    write(lmer_summary,file="results_file", 
      append=TRUE, sep="\t", quote=FALSE) 
} 

Am zweiten Gedanken, sollten Sie in der Lage sein, Ihre Berechnungen zu beschleunigen deutlich mit dem refit() Methode-in gebaut, die ein Modell rüstet für eine neue Antwortvariable: Angenommen, der Einfachheit halber, dass das erste Gen geneAAA genannt wird:

wfun <- function(x) write(summary(x), 
     file="results_file", append=TRUE, sep="\t",quote=FALSE) 
mod0 <- lmer(geneAAA ~ Treat1*Treat2 + (1|Batch), data=mydata) 
wfun(mod0) 
for (i in names(genefile)[-1]) { 
    mod1 <- refit(mod0,mydata[[i]]) 
    wfun(mod1) 
} 

(By the way, ich bin nicht sicher, dass Ihr write() Befehl sinnvoll tut etwas ...)

+0

Rolands Vorschlag funktionierte. Ich habe write() in capture.output() geändert. – EKarl

Verwandte Themen