#r #ggplot2 #predict #model-fitting #weighting
#r #ggplot2 #прогнозировать #подгонка модели #взвешивание
Вопрос:
Я использовал ‘predict’ для поиска подходящей линии для линейной модели (lm). Я создал. Поскольку lm был построен только на 2 точках данных и должен иметь положительный наклон, я заставил его пройти через начало координат (0,0). Я также взвесил функцию по количеству наблюдений, лежащих в основе каждой точки данных.
Вопрос 1: (РЕШАЕМЫЙ — см. Комментарий @Gregor) Почему предсказанная линия лежит намного ближе к моей второй точке данных (B), чем к моей первой точке данных (A), когда у B меньше базовых наблюдений? Я что-то неправильно закодировал здесь при взвешивании модели?
Вопрос 2: Построение графика GLM (link= logit) сейчас, но как я все еще могу принудительно выполнить это через 0,0? Я пробовал добавлять formula = y~0 x
в нескольких местах, но ни одно из них, похоже, не сработало.
M <- data.frame("rate" = c(0.4643,0.2143), "conc" = c(300,6000), "nr_dead" = c(13,3), "nr_surv" = c(15,11), "region" = c("A","B"))
M$tot_obsv <- (M$nr_dead M$nr_surv)
M_conc <- M$conc
M_rate <- M$rate
M_tot_obsv <- M$tot_obsv
#**linear model of data, force 0,0 intercept, weighted by nr. of observations of each data point.**
M_lm <- lm(data = M, rate~0 conc, weights = tot_obsv)
#**plot line using "predict" function**
x_conc <-c(600, 6700)
y_rate <- predict(M_lm, list(conc = x_conc), weights = tot_obsv, type = 'response')
plot(x = M$conc, y = M$rate, pch = 16, ylim = c(0, 0.5), xlim = c(0,7000), xlab = "conc", ylab = "death rate")
lines(x_conc, y_rate, col = "red", lwd = 2)
#**EDIT 1:**
M_glm <- glm(cbind(nr_dead, nr_surv) ~ (0 conc), data = M, family = "binomial")
#*plot using 'predict' function*
binomial_smooth <- function(formula = (y ~ 0 x),...) {
geom_smooth(method = "glm", method.args = list(family = "binomial"), formula = (y ~ 0 x), ...)
}
tibble(x_conc = c(seq(300, 7000, 1), M$conc), y_rate = predict.glm(M_glm, list(conc = x_conc), type = "response")) %>% left_join(M, by = c('x_conc' = 'conc')) %>%
ggplot(aes(x = x_conc, y = y_rate)) xlab("concentration") ylab("death rate")
geom_point(aes(y = rate, size = tot_obsv)) binomial_smooth(formula = (y ~ 0 x)) theme_bw()
Комментарии:
1. Вы искусственно привязываете свою строку через (0, 0) . Ваша вторая точка находится в 5 раз дальше от 0, чем ваша первая точка, поэтому, несмотря на то, что у нее вдвое меньше наблюдений, у нее много рычагов воздействия.
2. Допустим, вы проводите линию от начала координат прямо через первую точку (300, 0,46). Экстраполируя до 6000, значение y будет равно 2,32, с остатком 2,32 — 0,2143 = 2,1. Квадрат остатка (то, что
lm
минимизируется) равен 4,45. С другой стороны, если мы проведем прямую линию от (0, 0) до второй точки в (6000, 0.2143), прогнозируемое значение для первой точки будет равно 0.04, для остатка 0.46 — .04 = 0.42. Квадрат невязки составляет около 0,18.3. Веса по существу умножают квадраты остатков, поскольку существует соотношение веса 2: 1, 0,18 становится 0,36, а 4,45 остается как есть и абсолютно доминирует — это в 12 раз больше! Поэтому, конечно, линия наилучшего соответствия будет намного ближе к точке 6000.
4. Судя по именам ваших столбцов, вы моделируете ставки. Итак, вместо этого позвольте мне предложить
glm
. Используйте логистическую регрессию (GLM с логической связью) для моделирования пропорций или используйте регрессию Пуассона (GLM с логической связью, используя количество наблюдений в качестве смещения). Таким образом, вы не будете экстраполировать прямые линии за пределы возможного.5. Спасибо за вашу помощь! Я пробовал функцию glm (см. Отредактированный Код), но теперь я не могу понять, как заставить ее пройти через 0,0. Я попытался добавить
formula = y~0 x
в нескольких местах, и, похоже, ни один из них не работает. Есть мысли о том, чего мне не хватает?