2017-01-15 27 views
4

캐럿을 사용하여 GAM 모델의 유효성을 검사하고 싶습니다. 내 GAM 모델에는 이진 결과 변수, 위도 및 경도 좌표 쌍의 등방성 평탄성, 선형 예측기가 있습니다. mgcv를 사용할 때의 일반적인 구문은 다음과 같습니다.캐럿 패키지 - 부드럽고 선형적인 예측 자로 GAM을 교차 유효화합니다.

gam1 <- gam(y ~ s(lat , long) + x1 + x2, family = binomial(logit)) 

캐럿의 train 기능을 사용하여이 모델을 지정하는 방법을 잘 모르겠습니다. 이것은 내 구문 더 이하 :

cv <- train(y ~ lat + long + x1 + x2, 
      data = data, 
      method = "gam", 
      family = "binomial", 
      trControl = trainControl(method = "LOOCV", number=1, repeats=), 
      tuneGrid = data.frame(method = "GCV.Cp", select = FALSE)) 

문제는 난 단지 위도 긴 스무딩하고 X1과 X2가 선형으로 처리 할 것입니다.

감사합니다.

+0

기본하지만'캐럿 :: train' 회귀 또는 평활 스플라인을 허용하지 않습니다 공식 인수에서 기능을합니까? –

+0

'method = "glm"'일 때'train '에 대한 수식 인자에서 스플라인이나 다항식 함수를 사용하는 데 어려움이 없습니다. –

답변

4

누군가 mgcvmgcv 외부로 사용하는 것을 보는 것은 매우 흥미 롭습니다. 약간의 연구 끝에, 나는 당신을 실망시키기 위해 여기에 있습니다. 을 과 함께 사용하는 것은 적어도 현재의 지원이 caret 인 것은 좋지 않습니다.

하자 당신이 caret를 사용하는 경우 나 그냥, 당신에게 몇 가지 기본적인 질문을

  1. 어떻게 원활하게 기능에 대한 매듭의 수뿐만 아니라, 스플라인 기반 클래스를 지정할 수 있습니까?
  2. 2D 평활 기능을 어떻게 지정할 수 있습니까?
  3. te 또는 ti으로 텐서 곱 스플라인을 어떻게 지정할 수 있습니까?
  4. 어떻게 평활화 매개 변수를 조정할 수 있습니까? 당신은 modForm <- caret:::smootherFormula(x) 라인을 참조

    getModelInfo(model = "gam", regex = FALSE)$gam$fit 
    
    function(x, y, wts, param, lev, last, classProbs, ...) { 
          dat <- if(is.data.frame(x)) x else as.data.frame(x) 
          modForm <- caret:::smootherFormula(x) 
          if(is.factor(y)) { 
           dat$.outcome <- ifelse(y == lev[1], 0, 1) 
           dist <- binomial() 
          } else { 
           dat$.outcome <- y 
           dist <- gaussian() 
          } 
          modelArgs <- list(formula = modForm, 
               data = dat, 
               select = param$select, 
               method = as.character(param$method)) 
          ## Intercept family if passed in 
          theDots <- list(...) 
          if(!any(names(theDots) == "family")) modelArgs$family <- dist 
          modelArgs <- c(modelArgs, theDots)     
          out <- do.call(getFromNamespace("gam", "mgcv"), modelArgs) 
          out  
          } 
    

    :

당신이 caret::trainmethod = "gam"와 함께 무엇을하고 있는지 알고는 피팅 루틴을 체크 아웃 할 경우? 그 라인은 핵심이며, 다른 라인은 모델 호출의 일상적인 구성입니다. 그래서, GAM 공식 caret가 건설되는 것과 수표를 보자 : 한마디로

caret:::smootherFormula 

function (data, smoother = "s", cut = 10, df = 0, span = 0.5, 
    degree = 1, y = ".outcome") 
{ 
    nzv <- nearZeroVar(data) 
    if (length(nzv) > 0) 
     data <- data[, -nzv, drop = FALSE] 
    numValues <- sort(apply(data, 2, function(x) length(unique(x)))) 
    prefix <- rep("", ncol(data)) 
    suffix <- rep("", ncol(data)) 
    prefix[numValues > cut] <- paste(smoother, "(", sep = "") 
    if (smoother == "s") { 
     suffix[numValues > cut] <- if (df == 0) 
      ")" 
     else paste(", df=", df, ")", sep = "") 
    } 
    if (smoother == "lo") { 
     suffix[numValues > cut] <- paste(", span=", span, ",degree=", 
      degree, ")", sep = "") 
    } 
    if (smoother == "rcs") { 
     suffix[numValues > cut] <- ")" 
    } 
    rhs <- paste(prefix, names(numValues), suffix, sep = "") 
    rhs <- paste(rhs, collapse = "+") 
    form <- as.formula(paste(y, rhs, sep = "~")) 
    form 
} 

를, 그것은 첨가제, 단 변량 부드러운을 만듭니다. 이것은 GAM이 처음 제안되었을 때의 고전적인 형태입니다.

이렇게하려면 이전에 나열한대로 mgcv에 대한 상당한 양의 제어 권한을 잃게됩니다.

이를 확인하려면, 내가 귀하의 경우와 유사한 예를 구성하자 y ~ s(x, z) + a + b :

set.seed(0) 
dat <- gamSim(eg = 2, scale = 0.2)$data[1:3] 
dat$a <- runif(400) 
dat$b <- runif(400) 
dat$y <- with(dat, y + 0.3 * a - 0.7 * b) 

#   y   x   z   a   b 
#1 -0.30258559 0.8966972 0.1478457 0.07721866 0.3871130 
#2 -0.59518832 0.2655087 0.6588776 0.13853856 0.8718050 
#3 -0.06978648 0.3721239 0.1850700 0.04752457 0.9671970 
#4 -0.17002059 0.5728534 0.9543781 0.03391887 0.8669163 
#5 0.55452069 0.9082078 0.8978485 0.91608902 0.4377153 
#6 -0.17763650 0.2016819 0.9436971 0.84020039 0.1919378 

그래서 우리는 모델에 맞게하는 것을 목표로하고 있습니다. 데이터 y은 가우스이지만, 이것은 중요하지 않습니다. caretmgcv과 작동하는 방식에는 영향을 미치지 않습니다.

cv <- train(y ~ x + z + a + b, data = dat, method = "gam", family = "gaussian", 
      trControl = trainControl(method = "LOOCV", number=1, repeats=1), 
      tuneGrid = data.frame(method = "GCV.Cp", select = FALSE)) 

당신은 최종 모델을 추출 할 수 있습니다 :

fit <- cv[[11]] 

그래서 사용하고 어떤 식?

참조? 그렇다 "첨가제, 단 변량"되는, 또한 기본으로 mgcv::s의 모든 잎 : @ 李哲源 ZheyuanLi에 동의 bs = "tp", 기본 k = 10

+0

고마워, 좋은 지적이야. 네가 원했던 것은 tp에 적응하는 것을 부드럽게하는 것과 비교하는 것입니다. 어떻게 캐럿에서 그것을 수행 할 것인지를 보지 못합니다. 그래서 교차 검증을 어렵게 코드 작성하는 방법이 있어야한다고 생각합니다. 그러나 그것은 내 기술을 초월한 것입니다. 누구든지 내가 할 수있는 몇 가지 코드를 가리킬 수 있습니까? 감사합니다. –

+0

감사합니다. 새로운 여기 :) –