Преобразование имен коэффициентов в формулу в R

При использовании формул с коэффициентами подогнанные модели называют коэффициенты XY, где X - это имя фактора, а Y - его конкретный уровень. Я хочу иметь возможность создать формулу из названий этих коэффициентов.

Причина: Если я подгоню лассо к разреженной матрице дизайна (как я делаю ниже), я хотел бы создать новый объект формулы, который будет содержать только члены для ненулевых коэффициентов.

require("MatrixModels")
require("glmnet")
set.seed(1)
n <- 200
Z <- data.frame(letter=factor(sample(letters,n,replace=T),letters),
                x=sample(1:20,200,replace=T))
f <- ~ letter + x:letter + I(x>5):letter
X <- sparse.model.matrix(f, Z)
beta <- matrix(rnorm(dim(X)[2],0,5),dim(X)[2],1)
y <- X %*% beta + rnorm(n)

myfit <- glmnet(X,as.vector(y),lambda=.05)
fnew <- rownames(myfit$beta)[which(myfit$beta != 0)]
 [1] "letterb"              "letterc"              "lettere"             
 [4] "letterf"              "letterg"              "letterh"             
 [7] "letterj"              "letterm"              "lettern"             
[10] "lettero"              "letterp"              "letterr"             
[13] "letters"              "lettert"              "letteru"             
[16] "letterw"              "lettery"              "letterz"             
[19] "lettera:x"            "letterb:x"            "letterc:x"           
[22] "letterd:x"            "lettere:x"            "letterf:x"           
[25] "letterg:x"            "letterh:x"            "letteri:x"           
[28] "letterj:x"            "letterk:x"            "letterl:x"           
[31] "letterm:x"            "lettern:x"            "lettero:x"           
[34] "letterp:x"            "letterq:x"            "letterr:x"           
[37] "letters:x"            "lettert:x"            "letteru:x"           
[40] "letterv:x"            "letterw:x"            "letterx:x"           
[43] "lettery:x"            "letterz:x"            "letterb:I(x > 5)TRUE"
[46] "letterc:I(x > 5)TRUE" "letterd:I(x > 5)TRUE" "lettere:I(x > 5)TRUE"
[49] "letteri:I(x > 5)TRUE" "letterj:I(x > 5)TRUE" "letterl:I(x > 5)TRUE"
[52] "letterm:I(x > 5)TRUE" "letterp:I(x > 5)TRUE" "letterq:I(x > 5)TRUE"
[55] "letterr:I(x > 5)TRUE" "letteru:I(x > 5)TRUE" "letterv:I(x > 5)TRUE"
[58] "letterx:I(x > 5)TRUE" "lettery:I(x > 5)TRUE" "letterz:I(x > 5)TRUE"

Из этого я хотел бы получить формулу

~ I(letter=="d") + I(letter=="e") + ...(etc)

I проверил формулу () и all.vars () безрезультатно. Кроме того, написать функцию для синтаксического анализа это немного затруднительно из-за различных типов терминов, которые могут возникнуть. Например, для x: letter, когда x - числовое значение, а буква - фактор, или I (x> 5): letter как еще один неприятный случай.

Так что я не знаю какой-либо функции для преобразования между формулой и ее символьное представление и обратно?

9
задан Gavin Simpson 25 November 2010 в 23:44
поделиться