Объединение семейства функций grep () с условным if - PullRequest
2 голосов
/ 28 февраля 2020

Я использую LASSO в качестве метода выбора переменных для моего анализа, но есть одна конкретная переменная, которую я sh должен обеспечить, чтобы она содержалась в окончательной формуле. Я автоматизировал весь процесс, чтобы вернуть переменные, которые LASSO выбирает, и разбивает их в формулу символьной строки, например формула = y ~ x1 + x2 + x3 + ... Однако есть одна переменная, в частности, которую я хотел бы сохранить в формуле даже если LASSO не выбирает его. Теперь я мог легко добавить эту переменную в формулу после факта, но в интересах улучшения моих навыков R я пытаюсь автоматизировать весь процесс.

До сих пор я думал о том, чтобы достичь цели, когда вложил функцию grep () в оператор ifelse (), например ifelse(grep("variable I'm concerned with",formula)!=1, formula=formula,formula=paste0(formula,'variable I'm concerned with',collapse="+")), но это не помогло.

Прав ли я отслеживать или кто-нибудь может придумать альтернативные маршруты?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Согласно документации

штраф.фактор - к каждому коэффициенту могут применяться отдельные штрафные коэффициенты. Это число, которое умножает лямбда, чтобы позволить дифференциальную усадку. Может быть 0 для некоторых переменных, что означает отсутствие усадки, и эта переменная всегда включена в модель. По умолчанию 1 для всех переменных (и неявно бесконечность для переменных, перечисленных в исключении). Примечание: коэффициенты штрафа внутренне масштабируются до суммы в nvars, и лямбда-последовательность будет отражать это изменение.

Поэтому примените это в качестве аргумента к gl mnet, используя штрафной коэффициент 0 для вашего «ключевой коэффициент» и 1 в другом месте.

Формула не является символьным объектом, но вы можете изучить terms.formula, если ваша цель - редактировать формулы непосредственно на основе вывода символов. terms объекты - действительно мощные способы сделать подмножество переменных и выбор. Но вам действительно нужно исследовать его, потому что язык формул на самом деле не предназначен для простой автоматизации, скорее он должен был быть удобным и читаемым способом определения подгонки модели (посмотрите, насколько сложен SAS для сравнения).

f <- y ~ x1 +x2
t <- terms(f)

## drop 'x2'
i.x2 <- match('x2', attr(t, 'term.labels'))
t <- t[, -i.x2] ## drop the variable

## t is still a "terms" object but `lm` and related functions have implicit methods for interpreting as a "formula" object.

lm(t)
0 голосов
/ 28 февраля 2020

В настоящее время вы пытаетесь настроить символьное значение формулы для объекта формулы, который не будет работать с различными типами. Вместо этого рассмотрим stats::update, который не будет добавлять термины, еще не включенные в термин:

lasso_formula <- as.formula("y ~ x1 + x2 + x3")

# EXISTING TERM
lasso_formula <- update(lasso_formula, ~ . + x3)
lasso_formula
# y ~ x1 + x2 + x3

# NEEDED VARIABLE
lasso_formula <- update(lasso_formula, ~ . + myTerm)
lasso_formula
# y ~ x1 + x2 + x3 + myTerm

Если формула является строкой символов, обязательно используйте grepl (не grep) в ifelse. И не присваивайте с = внутри ifelse, поскольку она сама является функцией, возвращающей само значение, и ее не следует путать с if...else:

lasso_formula <- "y ~ x1 + x2 + x3"    

lasso_formula <- ifelse(grepl("myterm", lasso_formula),
                        lasso_formula,
                        paste(lasso_formula, "+ myterm"))    

lasso_formula 
# [1] "y ~ x1 + x2 + x3 + myterm"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...