2017-02-13 18 views
1

Я пытаюсь определить, как передать дополнительные параметры параметру statistic в функцию boot() в R, используя .... При чтении ?boot в нем указано, что «первый переданный аргумент всегда будет исходными данными. Второй будет вектором индексов, частот или весов, которые определяют образец бутстрапа .... Любые дополнительные аргументы могут быть переданы вstatisticчерез...аргумент Но я не знаю, как это будет на самом деле выглядит на практикеКак передать дополнительные параметры через ... в статистический параметр в boot()

Вот пример кода -... statFun это функция, которая принимает в некоторых данных и возвращает среднее значение Если дополнительный параметры передаются через команду ..., она центрирует данные вокруг этих дополнительных параметров, а затем retu RNS о среднем:

statFun <- function(funData, indices, ...) 
{ 
    # Check to see if extra parameters 
    extraPar <- list(...) 
    if(extraPar[[1]]) 
    { 
    result <- mean(funData[indices] - extraPar[[2]]) 
    }else 
    { 
    result <- mean(funData[indices]) 
    } 

    # Return the value 
    return(result) 
} 

# Testing statFun 
testData <- 1:20 ; testIndices <- length(testData) 
statFun(testData, testIndices, FALSE) # Returns 10.5 
statFun(testData, testIndices, TRUE, mean(testData)) # Returns 0 

Теперь, если я пытаюсь применить эту функцию в boot, я бегу в проблемы:

boot(testData, statFun, R = 100) 

, который дает мне Error in extraPar[[1]] : subscript out of bounds. Если я попробую передать FALSE в statFun, но все равно получаю ту же ошибку. Я могу понять, как мое определение неточно, но как я могу это преодолеть? Я прочитал this и this пост, чтобы понять, как использовать ... немного лучше, но я, кажется, что-то со всей очевидностью не хватает ...

Это мой первый пост SO, поэтому, пожалуйста, дайте мне знать, если мой вопрос Безразлично Не следуйте рекомендациям. Спасибо за любую помощь.

+0

Я получаю результаты 20 и 9.5 (что я ожидаю). –

+0

Я думаю, что справка означает, что вы можете передавать несколько аргументов через '...', но чтобы это сделать и чтобы их можно было передать, вы должны, вероятно, назвать их: поэтому используйте функцию statFun <- function (funData, indexs , center = FALSE, val = NULL) {'и соответственно изменить остальную часть вашей функции. Затем вы вызываете boot с помощью 'boot (testData, statFun, center = TRUE, val = mean (testData), R = 100)' – user20650

+0

на самом деле помощь для '...' argumnet говорит * «Другие ** именованные аргументы * * для статистики, которые передаются без изменений каждый раз, когда она вызывается * »(выделение мое) – user20650

ответ

1

Благодаря user20650 и чтение ?boot примеров немного более внимательно, я понял, что нужно - просто чтобы убедиться, что мои параметры в statFun названы и что я имею в виду эти имена в моем вызове boot. Простые вещи:

statFun <- function(funData, indices, addPars, centerMean) 
    { 
     # Check to see if extra parameters 
     if(addPars) 
     { 
     result <- mean(funData[indices] - centerMean) 
     }else 
     { 
     result <- mean(funData[indices]) 
     } 

     # Return the value 
     return(result) 
    } 

Теперь, когда я применяю это в ботинке и использовать имена addPars и centerMean, я получаю то, что я бы ожидать:

boot(testData, statFun, R = 100, extraPar = TRUE, numCenter = mean(testData)) 
# Returns boot object of data centered around the mean. 

Конечно лучше понять ... прямо сейчас.