2016-09-22 3 views
1

car :: boxCox 함수를 수제 함수로 래핑하여 데이터 집합의 목록에 적용 할 수 있습니다. 나는 family = "yjPower"를 사용하기 때문에 MASS 패키지가 아닌 car 패키지의 boxCox 함수를 사용하고 있습니다. 내 문제는 이상하게도 이해할 수 없거나 어떤 종류의 버그 일 수도 있습니다. 여기에 재현 예입니다수제 함수로 바꿀 때 car :: boxCox() 함수의 이상한 동작

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) 

이 나에게 오류 메시지를 제공합니다

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

boxCox이 할 수 있다고 가정한다 :

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

가 I의 라인에 문제를 핀 지적을 작품의 클래스 객체를 얻으려면 2 라인 전에 생성 된 관련 데이터를 찾지 못한다.

le.mod() 함수 밖에서도 잘 작동합니다. 아마도 환경 관리와 관련하여 문제가 될 것입니다. boxCox는 글로벌 환경에서는 "donn"을 찾고 있지만 찾을 수는 없으며, 특정 환경에서 그것을 찾지 않는 이유를 무시합니다.

아무도이 문제를 해결하거나 나에게 여기에서 이해할 수없는 것을 설명 할 생각이 있습니까? 나는 며칠 동안이 문제에 대해 머리를 터뜨 렸으며 제대로 작동하지 못했습니다.

감사

+2

문제는'update'로 넘어갑니다 ... 부모 프레임에서 호출을 평가하려고하는데, 이것은'le.mod'보다는'BoxCox' 환경에 있습니다. 왜 내가 * 항상 * 작동하는지 궁금 하네 ... –

+0

@ benBolker가 언급 한 바와 같이 업데이트 기능을 우회하려고 할 때, 'bcres <- boxCox (formula (dat $ val.gold ~ dat $ val.bad), family = "yjPower", plotit = F)'. 이것은 에러를 막지 만, 경고 #In lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...)를 가져온다 : # 추가 인수 'family'is disregarded.'. 그래서 그것은'family = "yjPower"라는 인자를 수식으로 객체로 사용할 수없는 것 같습니다. 저에게 잘 못된 서면 기능처럼 보입니다. – Bastien

답변

3

나는 누군가가 설명이있는 경우, 그것을 게시 주저하지 않도록 그러나 나는 행동의 이유를 이해할 수없는 대답을 (!)을 발견했습니다.

함수의 둘째 줄에 y=TRUE 추가하여 용액 : 어떤 이유로

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

이는 throught를 얻을 수있다.

+0

팁 주셔서 감사. 이것은 저를 약간 구했습니다. – user3293236