Ошибка в model.frame.default(object, data, xlev = xlev): объект не является матрицей

3 дня до R и не могу понять, что я делаю неправильно. Я пытаюсь отправить несколько столбцов с двусторонним взаимодействием в модель cox glmnet. У меня есть некоторый data.frame(), называемый dtable

Изменить, чтобы сделать код воспроизводимым

xs<-c("Col1", "Col2", "Col3")
v<-c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, NA, 25, 26, 27, 28, 29, 30)
df<-data.frame(matrix(v,ncol=3))
dm<-as.matrix(df)
dm<-matrix(dm[complete.cases(dm)], ncol=3)
colnames(dm)<-xs
dfdata<-data.frame(dm)
f<-as.formula(time~.*.)
xmatrix<-model.matrix(f, dfdata)[,-1]

Когда я запускаю это, я получаю сообщение об ошибке

Error in model.frame.default(object, data, xlev = xlev) :    
object is not a matrix

заранее спасибо


person Faller    schedule 18.11.2016    source источник


Ответы (3)


Это из-за формулы: время~.*. В data.frame() нет столбца времени, чтобы формула пересекала все.

person Faller    schedule 18.11.2016

Я думаю вместо этого:

dm<-matrix(dm[complete.cases(dm)], ncol=3)

Вы хотите это:

dm <- as.matrix(dm[complete.cases(dm), ])

Не для того, чтобы кричать в свой собственный рог (слишком много), но рассмотрите возможность использования glmnetUtils, чтобы упростить задачу управление фреймами данных, формулами и матрицами моделей.

person Hong Ooi    schedule 18.11.2016
comment
Спасибо, я посмотрю на это. что касается as.matrix(), я не получаю любви. - person Faller; 18.11.2016

Я подозреваю, что ошибка говорит именно о том, что не так. Объект, который вы передаете model.matrix(), не является матрицей. Каков результат class(data)? Вероятно, data.frame.

Попробуйте добавить as.matrix() к model.matrix() вызову data.

Еще два замечания: не называйте ваши data.frames data. Также задает вопросы здесь, используя воспроизводимый пример. Вы получите лучшие ответы.

person boshek    schedule 18.11.2016
comment
нет, model.matrix() требует data.frame() для второго члена. Замечено на двух других вещах, хотя. - person Faller; 18.11.2016