#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)