наклон для линейных моделей с разными перехватами: как стандартизировать / нормализовать наклоны для сравнения?

#r #linear-regression

#r #линейная регрессия

Вопрос:

У меня есть код для подгонки линейных моделей к данным в R. Моя независимая переменная — ВОЗРАСТ, а зависимая переменная — затраты. Меня интересует, увеличиваются ли затраты в целом с возрастом в годах. Однако для некоторых частей мой перехват равен 10, тогда как для других мой перехват равен 1000, и, следовательно, увеличение валютных единиц бесполезно, поскольку наклон в 1 единицу в год может быть большим для перехвата в 10, а наклон в 1 единицу валюты в год пренебрежимо мал. Кто-нибудь может помочь с решением этой проблемы, стандартизировать наклоны в R, чтобы сравнить их после их вычисления lm ?

Пример

 data.ex <- data.frame(Age = c(c(1:10), c(1:10)),
                  Costs = c(11,12,13,14,15,12,17,18,19,20, 1001,1002,1003,1004,999,1006,1007,1008,1009,1010),
                  Type = c(rep("A", 10), rep("B", 10)))
pt <- ggplot(data = data.ex, aes(x=Age, y = Costs)) 
geom_smooth(method="lm") 
facet_wrap(facets = "Type", nrow = 2)
plot(pt)
print(with(data.ex[data.ex$Type == "A", ], lm(Costs ~ Age)))
print(with(data.ex[data.ex$Type == "B", ], lm(Costs ~ Age)))   
  

Комментарии:

1. Добавить scales = "free_y" аргумент в facet_wrap

Ответ №1:

Как указывали другие, установка scales = 'free' в facet_wrap сделает обе линии более заметными на графике.

Что касается вашего другого вопроса, ваша формулировка немного неясна, но звучит так, как будто вы говорите: «Если базовые затраты начинаются с 10 долларов, то увеличение на 1 доллар в год является существенным, тогда как при базовой стоимости в 1000 долларов США 1 доллар в год не является значительным. Как мне показать эту разницу? «

Одним из способов было бы нормализовать каждую группу по отношению к ее перехвату:

 library(dplyr)

# calculate intercepts for each group and extract them:
intercept.ex <- group_by(data.ex, Type) %>% 
  do(data.frame(intercept = coef(lm(Costs ~ Age, data = .))[1]))

# normalize the values in each group against their intercepts
data.ex <- merge(data.ex, intercept.ex) %>% 
  mutate(Costs = Costs / intercept)

# Age slope = 0.1002
print(with(data.ex[data.ex$Type == "A", ], lm(Costs ~ Age)))

# Age slope = 0.001037
print(with(data.ex[data.ex$Type == "B", ], lm(Costs ~ Age))) 
  

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

Комментарии:

1. Я многому научился из вашего кода, а также о dplyr, одном из моих любимых пакетов. Спасибо!! У вас есть идея, почему мой вопрос был отклонен? Я немного смущен, я сделал что-то не так?

2. О, и, может быть, вы могли бы описать, в чем преимущество использования вызова «do»? спасибо 🙂

3. Формулировка вашего вопроса была немного неясной, поэтому вы проголосовали против. Что касается do , эта функция предназначена для совместной работы group_by , применяя функцию или набор команд к каждой группе, созданной group_by .

4. спасибо за объяснение. в следующий раз я постараюсь быть более точным. ваше решение путем нормализации на пересечении было отличным, спасибо.

Ответ №2:

Вы можете попробовать использовать другой масштаб оси y … но на самом деле я действительно не понимаю вашу проблему.

 Age = c(1:10)
Costs = c(11,12,13,14,15,12,17,18,19,20) 
plot(Age, Costs, type="l", col="blue", lwd=2)

Costs = c(1001,1002,1003,1004,999,1006,1007,1008,1009,1010)
plot(Age, Costs, type="l", col="blue", lwd=2)