2015-09-03 4 views
1

Мне было интересно, как получить фактические компоненты от predict(..., type = 'term). Я знаю, что если я возьму rowSums и добавлю значение attr(,"constant") к каждому, я получу предсказанные значения, но то, что я не уверен, заключается в том, как этот attr(,"constant") разделяется между столбцами. В целом, как изменить матрицу, возвращаемую predict, чтобы каждое значение представляло коэффициент модели, умноженный на данные прогнозирования. Результатом должна быть матрица (или data.frame) с теми же размерами, что и возвращаемая predict, но rowSums автоматически добавляет к прогнозируемым значениям без необходимости дальнейшего изменения.Прогнозирование компонентов в R Линейная регрессия

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

Редактировать: Цель этого вопроса заключается не в том, чтобы создать способ суммирования строк, чтобы получить предсказанные значения, которые были предназначены только для проверки работоспособности.

Если у меня есть уравнение y = 2 * a + 3 * b + c, и мое предсказанное значение равно 500, я хочу знать, что такое 2 * a, что такое 3 * b, и что c был в этом конкретном точка. Сейчас я чувствую, что эти значения возвращаются predict, но они были масштабированы. Мне нужно знать, как их масштабировать.

+0

Единственное, что меняется при масштабировании прогнозируемого значения - это перехват ... коэффициенты не меняются. Я уже сказал это в ответ – jenesaisquoi

+0

Тогда я не понимаю, почему значения не совпадают. Когда вы прогнозируете линейную модель, вы просто принимаете коэффициент за раз, но это не результат. –

+0

действительно подгонял модель без перехвата, а затем предсказал, что условия не дают то, что вы искали? – jenesaisquoi

ответ

0

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

rowSums_lm <- function(A){ 
    if(!is.matrix(A) || is.null(attr(A, "constant"))){ 
      stop("Input must be a matrix with a 'constant' attribute") 
    } 
    rowSums(A) + attr(A, "constant") 
} 
+0

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

1

Это не дробить между колоннами - это соответствует пересечению. Если вы включаете перехват в модели, то это среднее из прогнозов. Например,

## With intercept 
fit <- lm(Sepal.Length ~ Sepal.Width + Species, data=iris) 
tt <- predict(fit, type="terms") 
pp <- predict(fit) 
attr(tt, "constant") 
# [1] 5.843333 
attr(scale(pp, scale=F), "scaled:center") 
# [1] 5.843333 
## or 
mean(pp) 
# [1] 5.843333 

Если вы сделаете модель без перехвата, там не будет постоянной, так что вы будете иметь матрицу, где rowSums соответствуют предсказаниям.

## Without intercept 
fit1 <- lm(Sepal.Length ~ Sepal.Width + Species - 1, data=iris) 
tt1 <- predict(fit1, type="terms") 
attr(tt1, "constant") 
# [1] 0 

all.equal(rowSums(tt1), predict(fit1)) 
## [1] TRUE 

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

fit2 <- lm(scale(Sepal.Length, scale=F) ~ Sepal.Width + Species, data=iris) 
all.equal(coef(fit2)[-1], coef(fit)[-1]) 
## [1] TRUE 
+0

Спасибо, но я все это понял. То, что мне нужно, можно объяснить с помощью вашего примера. Первое значение 'Sepal.Width' в' iris' имеет значение 3.5. В вашей модели коэффициент для 'Sepal.Width' равен 0,8036. Поэтому я хочу изменить первое значение столбца 'Sepal.Width' в tt так, чтобы оно было равно .8036 * 3.5 = 2.8126. Это значение в настоящее время .3557, и мой вопрос должен был спросить, как связаны .3557 и 2.8126, и как я могу рассчитать один, учитывая другой. –

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