Фон
Я пишу свою функцию самоопределения. Функция принимает данные из фрейма данных с нефиксированным количеством функций. Кроме того, тип функций может отличаться, например numeric
, factor
и chr
.
Я хочу максимизировать свою функцию правдоподобия, которая поддерживается в расширенной матрице данных, с преобразованием log
каждой функции и до quadratic
порядков, например столбцов interception + log(feature1) + feature1 + feature1^2 + log(feature2)+..+ feature1*feature2 + ... + feature_{n-1}*feature_n
В качестве примера возьмем встроенный набор данных iris
:
Код:
str(iris)
Out:
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Как мы видим первые 4 функции, от Sepal.length
до Petal.Width
, обозначены цифрами c. Я хочу сделать модель по их заказам от log
до quadratic
. Поэтому я хочу вывести матрицу данных следующим образом:
Код:
colnames(model.matrix(~ 1+ log(Sepal.Length) + poly(Sepal.Length,degree = 2)
+ log(Sepal.Width) + poly(Sepal.Width,degree = 2) +
log(Petal.Length) + poly(Petal.Length,degree = 2)+
log(Petal.Width) + poly(Petal.Width,degree = 2)+Sepal.Length*Sepal.Width + Sepal.Length*Petal.Length+ Sepal.Length*Petal.Width + Sepal.Width*Petal.Length +Sepal.Width*Petal.Width + Petal.Length*Petal.Width,data = iris))
Out:
[1] "(Intercept)" "log(Sepal.Length)"
[3] "poly(Sepal.Length, degree = 2)1" "poly(Sepal.Length, degree = 2)2"
[5] "log(Sepal.Width)" "poly(Sepal.Width, degree = 2)1"
[7] "poly(Sepal.Width, degree = 2)2" "log(Petal.Length)"
[9] "poly(Petal.Length, degree = 2)1" "poly(Petal.Length, degree = 2)2"
[11] "log(Petal.Width)" "poly(Petal.Width, degree = 2)1"
[13] "poly(Petal.Width, degree = 2)2" "Sepal.Length"
[15] "Sepal.Width" "Petal.Length"
[17] "Petal.Width" "Sepal.Length:Sepal.Width"
[19] "Sepal.Length:Petal.Length" "Sepal.Length:Petal.Width"
[21] "Sepal.Width:Petal.Length" "Sepal.Width:Petal.Width"
[23] "Petal.Length:Petal.Width"
Проблема
Проблема заключается в что использование poly
для ввода формулы с нуля не является мудрым , особенно когда у нас сотни функций ! Моя функция должна обрабатывать фрейм данных автоматически .
Я знаю, model.matrix
может расширить мой исходный набор данных, например iris
. model.matrix
может даже автоматически работать с factor
и chr
функциями, преобразовывая их в фиктивные переменные. И poly
может расширить функцию до high orders
, но не обеспечивает преобразования log
.
Мой вопрос заключается в том, как получить преобразование порядка log
и до quadratic
любого данного кадра данных автоматически. Я хочу поделиться своей новой моделью с другими, поэтому я считаю, что моя функция должна быть реплицируемой на любые другие наборы данных.