2013-12-21 5 views
1

Я пытаюсь вычислить коэффициент корреляции между остатками линейной регрессии и независимой переменной p.Расчет корреляции между остатками линейной регрессии с NA и независимой переменной в R

В принципе, линейная регрессия оценивает текущие продажи в зависимости от текущей цены p и прошлой ценой p1. Вектор текущих цен mydf$p имеет длину 8, но остатки представляют собой вектор длины 7, поскольку одна запись была удалена из-за значения NAp1.

# lag vector and pad with NAs 
# Source: http://heuristically.wordpress.com/2012/10/29/lag-function-for-data-frames/ 
lagpad <- function(x, k) { 
    if (!is.vector(x)) 
    stop('x must be a vector') 
    if (!is.numeric(x)) 
    stop('x must be numeric') 
    if (!is.numeric(k)) 
    stop('k must be numeric') 
    if (1 != length(k)) 
    stop('k must be a single number') 
    c(rep(NA, k), x)[1 : length(x)] 
} 

mydf <- data.frame(p = c(10, 8, 10, 9, 10, 9, 10, 8)) 
mydf$p1 <- lagpad(mydf$p,1) 
mydf$sales <- with(mydf, 200 - 15 * p + 5 * p1) + rnorm(nrow(mydf), 0,0.13) 

model <- lm(data = mydf, formula = 'sales ~ p + p1') 

print(summary(model)) 

print(cor(residuals(model), mydf$p)) 
# Error in cor(residuals(model), mydf$p) : incompatible dimensions 

В данном конкретном случае, проста в использовании mydf$p[2:8] вместо mydf$p. Однако, как правило, может быть несколько строк в случайных местах, где затем удаляются NA. Как получить доступ к независимым переменным, которые фактически использовались в регрессии после удаления строк, содержащих NA?

Одна из моих попыток была основана на R documentation for lm. Я попытался получить доступ к матрице «x» через model[['x']], но это не сработало.

ответ

1

Вы можете получить фактические данные, используемые, чтобы соответствовать модели из model$model, а оттуда p колонка:

cor(residuals(model), model$model$p) 

В качестве альтернативы, is.na(mydf$p1) покажет вам, какие строки в mydf имеют NA в колонке p1:

cor(residuals(model), mydf$p[!is.na(mydf$p1)]) 

В общем, is.na(x) говорит нам о том, элементы x являются NA или нет:

> is.na(c(1,2,NA,4,NA,6)) 
[1] FALSE FALSE TRUE FALSE TRUE FALSE 
1

Х-матрица создается только при указании х = T в вызове лм. Тогда модель $ x даст вам значение x (это более идиоматично, что модель [['x']].

lm обрабатывает отсутствующие значения, просто полностью исключая наблюдение, где отсутствует значение. Возможно, вы хотите сделать что-то вроде:

cor(residuals(model), mydf$p[!is.na(mydf$p)]) 

1

model.matrix (модель), кажется, что вы ищете Затем вы можете выбрать переменные, которые вы хотите с помощью [] и номер столбца или имя

Смежные вопросы