2017-05-08 1 views
2

Ich habe einen Datensatz von Klimadaten in einem dat.frame (Spalten sind Messstationen, und Zeilen zeigen Zeit der Messung), und ich versuche es Finden Sie die richtigen Lambda-Werte in einer Yeo-Johnson-Transformation, um den Einfluss der Schiefe auf eine Hauptkomponentenanalyse zu begrenzen.R Problem: Ausführen von lm und dann ein Boxcox, um einen richtigen Lambda-Wert zu finden

Offensichtlich ist der erste Schritt ist, Wahrscheinlichkeiten zu erhalten melden Sie sich das beste Lambda zu finden: Ich verwende die folgende, wobei i der Index einer Spalte ist:

getYeoJohsnonLambda <- function(myClimateData,cols,lambda_min, lambda_max,eps) 
... 
lambda <- seq(lambda_min,lambda_max,eps) 
for(i in cols) 
    { 
    formula <- as.formula(paste("myClimateData$",colnames(myClimateData)[i],"~1")) 
    currentModel <- lm(formula,myClimateData) 
    print(currentModel) 
    myboxCox <- boxCox(currentModel, lambda = lambda ,family="yjPower", plotit = FALSE) 
    ... 
    } 

Wenn ich es versuche, für eine nennen climateData Zeitreihen, die zum Beispiel sein könnte:

`climateData <-data.frame(c(8.2,6.83,5.46,4.1,3.73,3.36,3,3,3,3,3.7),c(0,0.66,1.33,2,2,2,2,2,2,2,1.6))` 

ich diesen Fehler: Error in is.data.frame(data) : object 'myClimateData' not found

Das ist seltsam, wie lm es zu finden scheint und zurück ein korr ect fit, und myClimateData sollte gefunden werden, da es eines der Argumente der Funktion ist, oder?

+0

Das Problem besteht darin, wie Sie Ihre Formel formulieren: 'formula <- as.formula (einfügen (" myClimateData $ ", Spaltennamen (myClimateData) [i]," ~ 1 ")). Stattdessen versuchen so etwas wie 'lm (as.formula (Paste (COLNAMES (climateData) [1], "~ 1")), data = myClimateData)' –

+0

Ich habe versucht, zu ändern zu: \t \t 'Current <- lm (as.formula (Paste (COLNAMES (myClimateData) [i] "~ 1")), data = myClimateData) \t \t print (Current) \t \t myboxCox <- boxCox (Current, Lambda = lambda, Familie = "yjPower", plottit = FALSE) ' Aber ich habe immer noch den gleichen Fehler:" Fehler in is.data.frame (x): Objekt 'myClimateData' nicht gefunden "in der BoxCox Zeile. Das ist wirklich seltsam, da "myClimateData" einer der Funktionsargumente ist. – qwartz

Antwort

1

Leider scheint es, dass das Problem aus der Funktion kommt boxCox anstatt Ihre getYeoJohsnonLambda Funktion. Als BrodieG hingewiesen in a related question, verwendet diese Funktion parent.frame als Argument zu eval, die als schlechte Praxis in der doc angesehen wird.

Eine Möglichkeit, dies zu lösen, ist die Modelle vor dem Aufruf zu bauen, wie in Adam Quek ‚s Antwort vorgeschlagen:

library(car) 

climateData <- data.frame(c(8.2,6.83,5.46,4.1,3.73,3.36,3,3,3,3,3.7),c(0,0.66,1.33,2,2,2,2,2,2,2,1.6)) 
names(climateData) <- c("a","b") 

modelList <- list() 
for(k in 1:ncol(climateData)) { 
    modelList[[k]] <- lm(as.formula(paste0(names(climateData)[k],"~1")),data=climateData) 
} 

getYeoJohnsonLambda <- function(myClimateData, cols, lambda_min, lambda_max, eps) 
{ 
    #Recommended values for lambda_min = -0.5 and lambda_max = 2.0, eps = 0.1 
    myboxCox <- list() 
    lmd <- seq(lambda_min,lambda_max,eps) 
    for(i in cols) 
    { 
    cat("Creating model for column # ",i,"\n") 
    currentModel <- modelList[[i]] 
    myboxCox[[i]] <- boxCox(currentModel, lambda = lmd ,family="yjPower", plotit = FALSE) 

    } 
    return(myboxCox) 
} 

test <- getYeoJohnsonLambda(climateData,c(1,2) ,-0.5,2,0.1) 

Andere Lösung (wohl Reiniger): Verwenden Sie yeo.johnson in VGAM

library(VGAM) 

getYeoJohnsonLambda_VGAM <- function(myClimateData, cols, lambda_min, lambda_max, eps) 
{ 
    #Recommended values for lambda_min = -0.5 and lambda_max = 2.0, eps = 0.1 
    myboxCox <- list() 
    lmd <- seq(lambda_min,lambda_max,eps) 
    return(apply(climateData,2,yeo.johnson,lambda=lmd)) 
} 

test2 <- getYeoJohnsonLambda_VGAM(climateData,c(1,2) ,-0.5,2,0.1) 
+0

Ich fühle mich wirklich blöd Antoine, wie sich herausstellt, hat das Auto-Paket bereits eine "PowerTransform" -Funktion, die genau das macht, was ich will. Entschuldigen Sie die Unannehmlichkeiten... – qwartz

0

Hier ist eine Lösung ohne Fehlerbehebung bei der Funktion getYeoJohsnonLambda:

iris.dat <- iris[-5] 
vars <- names(iris.dat) 
lmd <- seq(.1, 1, .1) #lambda_min, lambda_max, eps 

all.form <- lapply(vars, function(x) as.formula(paste0(x, "~ 1"))) 
all.lm <- lapply(all.form, lm, data=iris.dat) 

library(MASS) 
all.bcox <- lapply(all.form, boxcox, data=iris.dat, 
      lambda=lmd, family="yjPower", plotit=FALSE) 
+0

Wie es scheint, ergibt dies "Fehler in boxcox.default (X [[i]], ...): Antwortvariable muss positiv sein Zusätzlich: Warnmeldung: In lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...): zusätzliches Argument 'family' wird ignoriert " In der Tat: meine Variablen haben Nullwerte (deshalb verwende ich Yeo-Johnson anstelle von Box-Cox). – qwartz

+0

Ein detaillierterer Blick auf Stack-Trace deutet darauf hin, dass es sich um ein Problem mit "eval (expr, envir, enclos)" handelt, das auf die Art von Problemen verweist, die in http://stackoverflow.com/questions/22617354/object-not-found aufgetreten sind -error-in-einem-benutzerdefiniert-funktion-eval-funktion ...Ich habe versucht, "noquote", wie sie es tun, aber ohne Erfolg. – qwartz

Verwandte Themen