модели слияния / cbind - PullRequest
       23

модели слияния / cbind

0 голосов
/ 25 августа 2018

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

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?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Я не совсем уверен, что это то, что вы пытаетесь сделать, но 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")])

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

0 голосов
/ 25 августа 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
...