слияние/связывание матриц моделей

Это упрощенная версия моей текущей проблемы. Мне нужно создать model.matrix из двух матриц моделей, не теряя информации в «назначении». Например, рассмотрим данные и формулу

y<-rnorm(100); x1<-rnorm(100); x2<-rnorm(100); x3<-rnorm(100)
f1 <- y ~ x1 + x2 + x3

и 2 матрицы моделей X1 и X2, созданные с использованием

trms<-terms.formula(f1)
trms2<-drop.terms(trms, dropx = 2)
trms3<-drop.terms(trms, dropx = -2)
X1<-model.matrix(trms2)
X2<-model.matrix(trms3)

Есть ли простой способ создать из X1 и X2 матрицу X с 1 столбцом пересечения и с attr(,"assign"), которая была бы получена из f1?


person papgeo    schedule 25.08.2018    source источник
comment
@李哲源 Думаю, я слишком упростил задачу. На самом деле x1 может быть матрицей, x2 гладкой конструкцией (из mgcv: s(x2,k=10)) и x3 другой матрицей. Поэтому я хотел отбросить термины, чтобы обрабатывать их по-разному, в зависимости от того, что они из себя представляют, а затем объединить их.   -  person papgeo    schedule 25.08.2018
comment
@ 李哲源 нет, даже если в формуле есть факторы / матричные переменные?   -  person papgeo    schedule 25.08.2018


Ответы (2)


Я не совсем уверен, что это то, что вы пытаетесь сделать, но cbind() в этом случае работает нормально.

X <- cbind(X1, X2)
X <- X[, !duplicated(colnames(X))]

Затем вы можете объединить атрибуты из X1 и X2. Чтобы не получить дубликаты, вы можете взять только информацию о назначении из X2, которой еще нет в X1:

attributes(X)$assign <- c(attr(X1,"assign"), attr(X2,"assign")[!attr(X2,"assign") %in% attr(X1,"assign")])

Если это не то, что вы пытались сообщить нам.

person JBGruber    schedule 25.08.2018
comment
Спасибо. !duplicated конечно помогает, но attr(,"assign") мне не нужно. У него только 0, 1, 2 (3 отсутствует) - person papgeo; 25.08.2018
comment
Извините, я не понимаю этот комментарий. Что вы хотите вместо этого? - person JBGruber; 25.08.2018
comment
attr(X,"assign") для отображения 0,1,2,3. Сейчас показывает 0,1,2. - person papgeo; 25.08.2018

Если я правильно понимаю вопрос, как насчет чего-то простого и прямого, например:

X3                <- cbind(X1[,1:2], X2[,2], X1[,3])
attr(X3,"assign") <- c(0,1,2,3)
colnames(X3)      <- c("Intercept",attr(trms, "term.labels"))
head(X3)
  Intercept          x1         x2         x3
1         1 -1.28372461 -0.2598796  0.3028496
2         1  0.56880875  0.2803302  0.7593734
3         1 -0.32480770 -1.6705911 -1.1750247
4         1 -1.02761734 -0.1405454 -0.6805033
5         1  0.84218452 -0.1224962 -1.3882420
6         1  0.07221231  0.5587801 -0.9042751
person Hack-R    schedule 25.08.2018
comment
@papgeo О, спасибо, теперь я понимаю, что вы имели в виду! Позвольте мне исправить это в редактировании прямо сейчас. Обновление: см. мой исправленный ответ. - person Hack-R; 25.08.2018