Расширение полиномиальной функции в R - PullRequest
0 голосов
/ 21 марта 2020

В настоящее время я рассматриваю этот вопрос на SO и вижу, что OP утверждает, что, добавляя больше для циклов, вы можете расширить многочлены. Как именно вы это сделаете? Я пытаюсь расшириться до polyorder 5.

Расширение функции полинома в R

Вот код ниже:

polyexp = function(df){
  df.polyexp = df
  colnames = colnames(df)
  for (i in 1:ncol(df)){
    for (j in i:ncol(df)){
      colnames = c(colnames, paste0(names(df)[i],'.',names(df)[j]))
      df.polyexp = cbind(df.polyexp, df[,i]*df[,j])
    }
  }
  names(df.polyexp) = colnames
  return(df.polyexp)
}

В конечном счете, я Хотелось бы заказать матрицу , чтобы она расширялась в порядке степени Я попытался использовать функцию poly, но я не уверен, что вы можете упорядочить результат так, чтобы он возвращал , который начинается с степени 1, затем переходит к степени 2, затем к 3, 4 и 5.

1 Ответ

2 голосов
/ 21 марта 2020

«сортировать по степени» немного двусмысленно. x^2 и x*y оба имеют степень 2. Я предполагаю, что вы хотите отсортировать по общей степени, а затем по каждой из них по степени 1-го столбца; в пределах этого, по степени второго столбца, et c. (Я считаю, что по умолчанию игнорируется общая степень и сортировка по степени в последнем столбце, в том числе в последнем втором и т. Д., Но это не задокументировано, поэтому я не буду рассчитывать на это.)

Вот как использовать polym для этого. Столбцы именуются такими вещами, как "2.0" или "1.1". Вы можете отсортировать их в алфавитном порядке, и это будет хорошо до степени 9, но если вы преобразуете эти имена, используя as.numeric_version, ограничений нет. Поэтому преобразуйте имена столбцов в имена версий, получите порядок сортировки и используйте эту степень плюс, чтобы изменить порядок столбцов результата. Например,

df <- data.frame(x = 1:6, y = 0:5, z = -(1:6))

expanded <- polym(as.matrix(df), degree = 5)

o <- order(attr(expanded, "degree"),
           as.numeric_version(colnames(expanded)))

sorted <- expanded[,o]
# That lost the attributes, so put them back
attr(sorted, "degree") <- attr(expanded, "degree")[o]
attr(sorted, "coefs") <- attr(expanded, "coefs")
class(sorted) <- class(expanded)

# If you call predict(), it comes out in the default order,
# so will need sorting too:

predict(sorted, newdata = as.matrix(df[1,]))[, o]
#>       0.0.1       0.1.0       1.0.0       0.0.2       0.1.1       0.2.0 
#>  0.59761430 -0.59761430 -0.59761430  0.54554473 -0.35714286  0.54554473 
#>       1.0.1       1.1.0       2.0.0       0.0.3       0.1.2       0.2.1 
#> -0.35714286  0.35714286  0.54554473  0.37267800 -0.32602533  0.32602533 
#>       0.3.0       1.0.2       1.1.1       1.2.0       2.0.1       2.1.0 
#> -0.37267800 -0.32602533  0.21343368 -0.32602533  0.32602533 -0.32602533 
#>       3.0.0       0.0.4       0.1.3       0.2.2       0.3.1       0.4.0 
#> -0.37267800  0.18898224 -0.22271770  0.29761905 -0.22271770  0.18898224 
#>       1.0.3       1.1.2       1.2.1       1.3.0       2.0.2       2.1.1 
#> -0.22271770  0.19483740 -0.19483740  0.22271770  0.29761905 -0.19483740 
#>       2.2.0       3.0.1       3.1.0       4.0.0       0.0.5       0.1.4 
#>  0.29761905 -0.22271770  0.22271770  0.18898224  0.06299408 -0.11293849 
#>       0.2.3       0.3.2       0.4.1       0.5.0       1.0.4       1.1.3 
#>  0.20331252 -0.20331252  0.11293849 -0.06299408 -0.11293849  0.13309928 
#>       1.2.2       1.3.1       1.4.0       2.0.3       2.1.2       2.2.1 
#> -0.17786140  0.13309928 -0.11293849  0.20331252 -0.17786140  0.17786140 
#>       2.3.0       3.0.2       3.1.1       3.2.0       4.0.1       4.1.0 
#> -0.20331252 -0.20331252  0.13309928 -0.20331252  0.11293849 -0.11293849 
#>       5.0.0 
#> -0.06299408

Создано в 2020-03-21 пакетом представить (v0.3.0)

...