2016-04-27 12 views
1

Ich versuche, LME-Funktion aus NLME-Paket innerhalb einer FOR-Schleife zu verwenden. Ich habe jetzt (fast) alles versucht, aber ohne Glück. Ohne die Schleife funktionieren meine LME-Funktion einwandfrei. Ich habe 681 verschiedene Lipide zu analysieren, also brauche ich die Schleife.Erstellen einer Schleife für lme() in r

Bonus Info:

>dput(head("ex.lme(loop)")) structure(list(Lacal.Patient.ID = c(12L, 12L, 12L, 13L, 13L, 13L), Time = c(0L, 1L, 3L, 0L, 1L, 3L), Remission = c(0L, 0L, 1L, 0L, 0L, 1L), Age = c(46L, 43L, 36L, 47L, 34L, 45L), SEX = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("f", "m"), class = "factor"), BMI = c(25L, 26L, 23L, 27L, 26L, 27L), Sph = c(0.412, 1.713, 1.48, 0.735, 1.025, 1.275), S1P = c(2.412, 3.713, 3.48, 2.735, 3.025, 3.275), Cer..C16. = c(1.4472, 2.2278, 2.088, 1.641, 1.815, 1.965)), .Names = c("Lacal.Patient.ID", "Time", "Remission", "Age", "SEX", "BMI", "Sph", "S1P", "Cer..C16."), row.names = c(NA, 6L ), class = "data.frame"):

  • Ich habe wie diese str() und meine Daten haben die gleichen Längen vor der Schleife

Eine vereinfachte Version meiner Daten sehen verwendet

Hier ist was ich mache ich R:

library(nlme) attach(cer_data) Remission <- factor(Remission) Time <- factor(Time) SEX <- factor(SEX)

Wie ich denke, die Schleife sollte wie folgt aussehen:

lipid <-as.matrix(cer_data[,c(7:9)]) # my lipids a at row 7-9in my data 
beg <- 1 
end <- nrow(lipid) 
dim(lipid) 
for (i in beg:end) { 
    print(paste("Running entity: ", colnames(lipid)[i], " which is ",i, " out of", end)) 
    variable <- as.numeric(lipid[i]) 
    lme_cer <- lme(variable ~ Remission + Time + Age + BMI + SEX, random = ~1|Lacal.Patient.ID, method = "REML", data = cer_data) 
} 

Fehler: Fehler bei model.frame.default (Formel = ~ variable + + Remission Time +: für variable Längen abweichen (gefunden 'Erlass')

Ohne die Schleife meiner Analyse arbeitet gut (Lipid (x) ist nur eine der Lipide):

lme_cer <- lme(lipid(x) ~ Remission + Time + Age + BMI + SEX , random = ~1 | Lacal.Patient.ID, method = "REML", data = cer_data) 
summary(lme_cer) 

Kann jemand das Problem mit meiner Schleife sehen? Ich bin es nicht gewohnt, R zu programmieren oder zu benutzen, also gibt es wahrscheinlich dumme Fehler.

+0

Jetzt machen Sie die lme für jede Zeile und es ist falsch. Schau dir 'end <- nrow (lipid)' an. Sie sollten einzigartige Lipide auswählen und die Schleife für sie machen. – Mateusz1981

+0

und "dput" die Daten, die Sie verwenden, um die Frage reproduzierbar zu machen – Mateusz1981

+0

Sie sollten neu bewerten, was in den Zeilen und Spalten Ihres Datensatzes ist. Vier Beobachtungen: Erstens, wenn Sie Ihre Lipiddaten erstellen, wählen Sie eine Anzahl von Spalten aus dem vollständigen Datensatz. Zweitens schreiben Sie aus irgendeinem Grund "meine Lipide sind in Reihe 1-881", was sicherlich nicht korrekt ist. Drittens erstellen Sie eine Schleife von '1 'bis' nrow (lipids)', auch wenn sich Ihre Variablen in den Spalten (und nicht in den Zeilen) befinden. Schließlich wählen Sie innerhalb der Schleife "lipid [i]", das weder eine Zeile noch eine Spalte auswählt, sondern nur ein einzelnes Element dieser Matrix. – SimonG

Antwort

1

eine blinde Antwort etw sein, vorausgesetzt, dass Ihre abhängigen Variablen in Spalten und nicht in Zeilen organisiert sind (wie ich denke, sie sind).

Der Hauptunterschied zwischen meinem Ansatz und Ihrem Ansatz besteht darin, dass ich die Namen der Lipide und nicht ihre Position im Datensatz überstreiche. Dadurch kann ich (a) einen temporären Datensatz weniger fehleranfällig konstruieren und (b) eine temporäre Formel für den Fixed-Effects-Teil Ihres Modells erstellen.

Die Funktion lme wird dann auf den temporären Datensatz mit der temporären Formel angewendet, und das Ergebnis wird in einer Liste gespeichert, um den Zugriff zu erleichtern.

# names of lipids 
lipid.names <- colnames(cer_data)[1:881] 
no.lipids <- length(lipid.names) 

# create a named list to hold the fitted models 
fitlist <- as.list(1:no.lipids) 
names(fitlist) <- lipid.names 

# loop over lipid names 
for(i in lipid.names){ 

    # print status 
    print(paste("Running entity:", i, "which is", which(lipid.names==i), "out of", no.lipids)) 

    # create temporary data matrix and model formula 
    tmp <- cer_data[, c(i,"Remission","Time","Age","BMI","SEX","Local.Patient.ID")] 
    fml <- as.formula(paste(i, "~", paste(c("Remission","Time","Age","BMI","SEX"), collapse="+"))) 

    # assign fit to list by name 
    fitlist[[i]] <- lme(fml, random=~1|Lacal.Patient.ID, method="REML", data=tmp) 

} 

Meiner Meinung nach ist es am einfachsten, mit temporären Objekten zu arbeiten, die genau das enthalten, was bei dieser Iteration der Schleife benötigt wird.

Beachten Sie, dass ich diese Lösung nicht auf Fehler überprüfen kann, weil Sie kein reproduzierbares Beispiel geliefert haben: Here's how.

0

Ohne Ihre Daten zu kennen, vom Konzept her sollte es so, dass

df <- data.frame(lipid = rep(c(LETTERS[1:4]), each = 4), x1 = c(rnorm(16, 10, 1)), x2 = c(rnorm(16, 20, 5))) 
    df 

for (i in levels(df$lipid)){ 
    print(paste("MODEL", i, sep = "")) 
    df1 = subset(df, lipid == i) 
    model <- lm(x1~x2, data = df1) 
    print(summary(model)$coef) 
} 
1

Lösung: Meine Schleife arbeitet nun mit diesem einfachen Code:

lipid <-as.data.frame(cer_data[,c(7:9)]) dim(lipid) for (i in 1:length(lipid)) { variable <- lipid[,i] lme_cer <- lme(variable ~ factor(Remission) + Time + Age + BMI + SEX, random = ~1 | Lacal.Patient.ID, method = "REML", data = cer_data) print(summary(lme_cer)$tTable) }

Vielen Dank an alle für die tolle Hilfe!