2014-09-12 2 views
3

Может ли пакет эффектов в R использоваться для построения (маргинального) эффекта для линейной модели, которая не включает перехват?Может ли пакет эффектов в R использоваться для моделей lm без перехватов?

Вот некоторые R код, который я пытался для такой модели:

x <- seq(1,100,by=0.1) 
y <- 1 + 2*x + rnorm(n=length(x)) 

model <- lm(y ~ 0 + x) 

require(effects) 
plot(allEffects(model)) 

Ошибка производит выглядит следующим образом:

Error in plot(allEffects(model)) : 
error in evaluating the argument 'x' in selecting a method for function 'plot': 
Error in mod.matrix %*% mod$coefficients[!is.na(mod$coefficients)] : 
non-conformable arguments 

Если у кого есть какие-либо идеи о том, как преодолеть эту ошибку, пожалуйста, дай мне знать.

Спасибо,

Изабелла

ответ

3

Там уверены, действительно кажется, что это ошибка в коде. В частности, при отправке код allEffects вызывает effect, который вызывает Effect.lm. Данные воссоздан также с

Effect.lm("x", mod=model) 
# Error in mod.matrix %*% mod$coefficients[!is.na(mod$coefficients)] : 
# non-conformable arguments 

ошибки появляется выйти из линии 30 тела этой функции

body(effects:::Effect.lm)[[30]] 
# mod.matrix <- mod.matrix[, !is.na(mod$coefficients)] 

Проблема возникает, когда у вас есть только-не-NA коэффициент (как бы с один регресс и отсутствие перехвата). Проблема в том, что когда вы делаете это подмножество в одном столбце, результат автоматически не переносится на вектор, а не на матрицу. Мы можем создать собственную версию функции, которая исправляет эту проблему

my.Effect.lm<-effects:::Effect.lm 
body(my.Effect.lm)[[30]] <- quote(mod.matrix <- mod.matrix[, !is.na(mod$coefficients), drop=FALSE]) 
environment(my.Effect.lm) <- asNamespace("effects") 

Тогда

model <- lm(y ~ 0 + x) 
plot(my.Effect.lm("x", model)) 

должен работать. Должен признаться, я не понял, как получить allEffects для работы. Я не помню, как изменить, как работает диспетчеризация S3, когда она разрешает функции в разных пространствах имен. Кажется, нет никакого простого способа исправить функцию, которая фактически находится в пространстве имен effects.

Таким образом, функция должна работать без перехватов, если у вас есть несколько регрессоров. Вы можете связаться с автором пакета, чтобы сообщить об этой проблеме.