Для того, чтобы newdata
работал, вы должны указать переменные как «сырые» значения, а не как $
:
library(bbmle)
m_r <- mle2(v ~ dbinom(size=n, prob = 1/(1+exp(-(a + br * river_dist)))),
start = list(a = 0, br = 0), data = ig)
На этом этапе, как предлагает @ user20650, вы ' Я также должен указать значение (или значения) для n
в newdata
.
Эта модель, похоже, идентична биномиальной регрессии: есть ли причина не использовать
glm(cbind(v,n-v) ~ river_dist, data=ig, family=binomial)
? (bbmle:mle2
является более общим, но glm
гораздо более надежным.) (Также: подгонка двух параметров к четырем точкам данных теоретически нормально, но вы не должны пытаться получить sh результаты слишком далеко ... в в частности, многие результаты по умолчанию из GLM / MLE являются асимптотическими c ...)
На самом деле, дважды проверяя соответствие соответствия MLE GLM, я понял, что метод по умолчанию ("BFGS "по историческим причинам) на самом деле не дает правильного ответа (!); переход на method="Nelder-Mead"
улучшает ситуацию. Добавление control=list(parscale=c(a=1,br=0.001))
к списку аргументов, или масштабирования расстояния реки (например, переход от «1 м» к «100 м» или «1 км» в качестве единицы) также решит проблему.
m_r <- mle2(v ~ dbinom(size=n,
prob = 1/(1+exp(-(a + br * river_dist)))),
start = list(a = 0, br = 0), data = ig,
method="Nelder-Mead")
pframe <- data.frame(river_dist=seq(500,1000,length=51),n=1)
pframe$prop <- predict(m_r, newdata=pframe, type="response")
CIs <- lapply(seq(nrow(ig)),
function(i) prop.test(ig[i,"v"],ig[i,"n"])$conf.int)
ig2 <- data.frame(ig,setNames(as.data.frame(do.call(rbind,CIs)),
c("lwr","upr")))
library(ggplot2); theme_set(theme_bw())
ggplot(ig2,aes(river_dist,v/n))+
geom_point(aes(size=n)) +
geom_linerange(aes(ymin=lwr,ymax=upr)) +
geom_smooth(method="glm",
method.args=list(family=binomial),
aes(weight=n))+
geom_line(data=pframe,aes(y=prop),colour="red")
Наконец, обратите внимание, что ваш третий по дальности сайт является выбросом (хотя небольшой размер выборки означает, что это не сильно повредит).