R авто вычислить особенности журнала и поли данных матрицы - PullRequest
0 голосов
/ 11 января 2020

Фон

Я пишу свою функцию самоопределения. Функция принимает данные из фрейма данных с нефиксированным количеством функций. Кроме того, тип функций может отличаться, например 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 любого данного кадра данных автоматически. Я хочу поделиться своей новой моделью с другими, поэтому я считаю, что моя функция должна быть реплицируемой на любые другие наборы данных.

...