2016-09-22 3 views
1

Ich versuche, das Auto :: BoxCox-Funktion in eine hausgemachte Funktion zu wickeln, so dass ich es auf eine Liste von Datensätzen zuordnen kann. Ich verwende die boxCox-Funktion aus dem Auto-Paket und nicht das MASS-Paket, weil ich die Familie = "yjPower" verwenden möchte. Mein Problem ist komisch und es ist entweder etwas, was ich nicht verstehe oder eine Art Bug. Hier ist ein reproduzierbares Beispiel:Seltsames Verhalten des Autos :: boxCox() Funktion, wenn in eine selbstgemachte Funktion wrap

library(car) 

le.mod <- function(val.gold,val.bad){ 
    donn <- data.frame(val.gold,val.bad) 
    res.lm <- lm(val.gold ~ val.bad, data=donn) 
    bcres <- boxCox(res.lm, family="yjPower", plotit=F) 
    lambda <- bcres$x[which.max(bcres$y)] 
    donn$val.bad.t <- donn$val.bad^lambda 
    res.lm <- lm(val.gold ~ val.bad.t, data=donn) 
    list(res.lm=res.lm, lambda = lambda) 
} 

xx <- runif(1000,1,100) 
xxt1 <- xx^0.6 + runif(1000,1,10) 
yy <- 2*xx + 10 + rnorm(1000,0,2) 

le.mod(yy,xxt1) 

Das gibt mir die Fehlermeldung:

## Error in is.data.frame(data) : object 'donn' not found 

ich das Problem auf der Linie Stift zackigen:

bcres <- boxCox(res.lm, family="yjPower", plotit=F) 

boxCox ist wohl der Lage sein, Um ein LM-Klassenobjekt zu nehmen, findet es nur nicht die zugehörigen Daten, die 2 Zeilen zuvor erstellt wurden.

Es funktioniert gut außerhalb der Funktion le.mod(). Es ist wahrscheinlich ein Problem im Zusammenhang mit dem Umweltmanagement, die boxCox-Funktion sucht in der globalen Umgebung nach "donn", aber nicht, und aus einem Grund ignoriere ich, dass ich nicht in der funktionsspezifischen Umgebung danach suche.

Hat jemand eine Idee, das zu beheben oder mir zu erklären, was ich hier nicht verstehe? Ich habe mich tagelang mit diesem Problem beschäftigt und es funktioniert nicht.

Dank

+2

Das Problem geht auf 'update' ..., das versucht, den Aufruf im übergeordneten Frame, der jetzt in der Umgebung von' BoxCox' statt innerhalb 'le.mod' ist, auszuwerten. Wundert mich, warum es * überhaupt * funktioniert ... –

+0

Um zu versuchen, die Update-Funktion zu umgehen (wie von @BenBolker erwähnt), indem man die problematische Zeile für 'bcres <- boxCox (formula (dat $ val.gold ~ dat $ val.bad), family = "yjPower", plottit = F) '. Dies verhindert den Fehler, bringt aber eine Warnung '#In lm.fit (x, y, Versatz = Versatz, singular.ok = singular.ok, ...): # zusätzliches Argument 'Familie' wird ignoriert.'. Es scheint also, dass ich das 'family =" yjPower "Argument nicht mit einer Formel als Objekt verwenden kann ??? Scheint mir wie eine schlecht geschriebene Funktion. – Bastien

Antwort

3

Ich habe die Antwort (!) Gefunden, aber ich kann nicht der Grund für das Verhalten verstehen, so, wenn jemand eine Erklärung haben, zögern Sie nicht, es zu veröffentlichen.

Die Lösung von y=TRUE in der zweiten Zeile der Funktion hinzugefügt:

res.lm <- lm(val.gold ~ val.bad, data=donn,y=TRUE) 

Aus irgendwelchen Gründen erlaubt dies es throught zu bekommen.

+0

Danke für den Tipp. Das hat mir etwas Zeit gespart. – user3293236

Verwandte Themen