Будет трудно ответить на этот вопрос без дополнительной информации от вас о структурах данных.
Код, который вы дали , должен работать, что предполагает, что вы, возможно, допустили какую-то простую опечатку. Чтобы подтвердить это, давайте сделаем быстрый воспроизводимый пример и увидим, что трехсторонние взаимодействия действительно генерируются из аналогичного кода из встроенного набора данных:
Нет взаимодействия:
> str(colnames(model.matrix(mpg ~ ., mtcars)))
chr [1:11] "(Intercept)" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
Двусторонние взаимодействия:
> str(colnames(model.matrix(mpg ~ .^2, mtcars)))
chr [1:56] "(Intercept)" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" "cyl:disp" ...
Трехсторонние взаимодействия:
> str(colnames(model.matrix(mpg ~ .^3, mtcars)))
chr [1:176] "(Intercept)" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" "cyl:disp" ...
Они на самом деле там?
> tail(colnames(model.matrix(mpg ~ .^3, mtcars)))
[1] "qsec:am:carb" "qsec:gear:carb" "vs:am:gear" "vs:am:carb" "vs:gear:carb" "am:gear:carb"
Да, да, они есть. Итак, ваш код должен работать. Возможно, вы просто что-то неверно истолковали?