Mam 100 kategorycznych zmiennych w dataframe i chcę stworzyć interakcje dla moich modeli predykcyjnych. Stworzyłem pętlę, aby to zrobić, ale kończę duplikaty.

df <- data.frame(Col1=c("A","B","C"), 
                 Col2=c("F","G","H"), 
                 Col3=c("X","Y","Z"))

Co daje nam:

  Col1 Col2 Col3
1    A    F    X
2    B    G    Y
3    C    H    Z

Kiedy uruchomię kod, aby utworzyć zmienne interakcje

vars <- colnames(df) 
for (i in vars)  {
  for (j in vars) {
    if (i != j) {
      df[,c(paste0(i, j))] <- paste(df[[i]],df[[j]],sep='*')}}}

Skończę dupkami, takimi jak Col1Col2 jest taki sam jak Col2Col1.

> str(df)
'data.frame':   3 obs. of  9 variables:
 $ Col1    : Factor w/ 3 levels "A","B","C": 1 2 3
 $ Col2    : Factor w/ 3 levels "F","G","H": 1 2 3
 $ Col3    : Factor w/ 3 levels "X","Y","Z": 1 2 3
 $ Col1Col2: chr  "A*F" "B*G" "C*H"
 $ Col1Col3: chr  "A*X" "B*Y" "C*Z"
 $ Col2Col1: chr  "F*A" "G*B" "H*C"
 $ Col2Col3: chr  "F*X" "G*Y" "H*Z"
 $ Col3Col1: chr  "X*A" "Y*B" "Z*C"
 $ Col3Col2: chr  "X*F" "Y*G" "Z*H"

Czy istnieje sposób na usunięcie tych dups?

3
stuski 20 luty 2018, 01:43

3 odpowiedzi

Najlepsza odpowiedź

Nie musisz tworzyć wyraźnej kolumny interakcji dla każdej pary zmiennych. Zamiast tego Col1 * Col2 w wzorze modelu wygeneruje interakcje automatycznie. Na przykład, jeśli zmienna wynikowa jest y (która byłaby kolumna w ramce danych) i chcesz formułę regresji ze wszystkimi dwukierunkowymi interakcjami między innymi kolumnami, możesz zrobić:

form = reformulate(apply(combn(names(df)[-grep("y", names(df))], 2), 2, paste, collapse="*"), "y")

form
y ~ Col1 * Col2 + Col1 * Col3 + Col2 * Col3

Następnie model regresji byłby:

mod = lm(form, data=df)
2
eipi10 20 luty 2018, 21:56

Możliwa odpowiedź na twoje pytanie: Jak automatycznie Wszystkie 2-drożne interakcje w modelu GLM w R

You can do two-way interactions simply using `.*.` and arbitrary n-way interactions writing `.^n`. `formula(g)` will tell you the expanded version of the formula in each of these cases.
0
Amar 19 luty 2018, 22:54

Jedna opcja może być przy użyciu funkcji combn i apply. Jedna funkcja niestandardowa będzie potrzebna do wydrukowania dwóch wartości kategorycznych oddzielonych * (np A*F).

# data
df <- data.frame(Col1=c("A","B","C"), 
                 Col2=c("F","G","H"), 
                 Col3=c("X","Y","Z"))

#function to paste two values together in A*F format
multiplyit <- function(x){
  paste(x, collapse = "*")
}

# Call combn using apply
df2 <- t(apply(df, 1, combn, 2, multiplyit))

#generate and set column names of df2
colnames(df2) <- paste("Col", combn(1:3, 2, paste, collapse="Col"), sep="")

#combine df and df2 to get the final df
df_final <- cbind(df, df2)

df_final
#  Col1 Col2 Col3 Col1Col2 Col1Col3 Col2Col3
#1    A    F    X      A*F      A*X      F*X
#2    B    G    Y      B*G      B*Y      G*Y
#3    C    H    Z      C*H      C*Z      H*Z
0
MKR 20 luty 2018, 00:17