Когда я запускал код, я получал что-то немного другое, так как set.seed () не был указан. Вместо того, чтобы использовать переменную name «letter», я использовал «letter_» в качестве удобного маркера разделения:
> fnew <- rownames(myfit$beta)[which(myfit$beta != 0)]
> fnew
[1] "letter_c" "letter_d" "letter_e" "letter_f" "letter_h" "letter_k" "letter_l"
[8] "letter_o" "letter_q" "letter_r" "letter_s" "letter_t" "letter_u" "letter_v"
[15] "letter_w"
Затем сделали разбиение и упаковали в матрицу символов:
> fnewmtx <- cbind( lapply(sapply(fnew, strsplit, split="_"), "[[", 2),
+ lapply(sapply(fnew, strsplit, split="_"), "[[", 1))
fnewmtx
[, 1] [, 2]
letter_c "c" "letter"
letter_d "d" "letter"
буква "е" "буква"
letter_f "f" "letter" отрубил остальные
И обернул выходные данные функции вставки в as.formula (), что является половиной ответа на вопрос, как «преобразовать формулу и ее символьное представление и обратно». Другая половина - as.character ()
form <- as.formula( paste("~",
paste(
paste(" I(", fnewmtx[,2], "_ ==", "'",fnewmtx[,1],"') ", sep="") ,
sep="", collapse="+")
)
) # edit: needed to add back the underscore
А теперь выводом является соответствующий объект класса:
> class(form)
[1] "formula"
> form
~I(letter_ == "c") + I(letter_ == "d") + I(letter_ == "e") +
I(letter_ == "f") + I(letter_ == "h") + I(letter_ == "k") +
I(letter_ == "l") + I(letter_ == "o") + I(letter_ == "q") +
I(letter_ == "r") + I(letter_ == "s") + I(letter_ == "t") +
I(letter_ == "u") + I(letter_ == "v") + I(letter_ == "w")
Мне интересно, что преобразование as.formula превратило одинарные кавычки вокруг букв в двойные.
Редактировать: Теперь, когда у проблемы есть дополнительное измерение или два, я предлагаю пропустить воссоздание формулы. Обратите внимание, что имена строк myfit $ beta в точности совпадают с именами столбцов X, поэтому вместо выбора ненулевых имен строк в качестве индексов выберите столбцы в матрице X:
> str(X[ , which( colnames(X) %in% rownames(myfit$beta)[which(myfit$beta != 0)] )] )
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:429] 9 54 91 157 166 37 55 68 117 131 ...
..@ p : int [1:61] 0 5 13 20 28 36 42 50 60 68 ...
..@ Dim : int [1:2] 200 60
..@ Dimnames:List of 2
.. ..$ : chr [1:200] "1" "2" "3" "4" ...
.. ..$ : chr [1:60] "letter_b" "letter_c" "letter_e" "letter_f" ...
..@ x : num [1:429] 1 1 1 1 1 1 1 1 1 1 ...
..@ factors : list()
> myfit2 <- glmnet(X[ , which( colnames(X) %in% rownames(myfit$beta)[which(myfit$beta != 0)] )] ,as.vector(y),lambda=.05)
> myfit2
Call: glmnet(x = X[, which(colnames(X) %in% rownames(myfit$beta)[
which(myfit$beta != 0)])],
y = as.vector(y), lambda = 0.05)
Df %Dev Lambda
[1,] 60 0.9996 0.05