【问题标题】:Why is the predict() function recycling the same four values for my GLM? [duplicate]为什么 predict() 函数会为我的 GLM 回收相同的四个值? [复制]
【发布时间】:2020-05-23 17:52:55
【问题描述】:

我做了一个相当简单的二项式回归模型:

m_r <- mle2(ig$v ~ dbinom(size=ig$n, prob = 1/(1+exp(-(a + br * ig$river_dist)))),
    start = list(a = 0, br = 0), data = ig)

基于此数据框:

> ig
    v   n ig_dist river_dist tam_dist       site
1 102 256     950       1040     1040     Boveda
2   1  11    4800        720      832 Cuchaconga
3  19  24    2000        475      475   Ishpingo
4  12  15    3400        611      800    La Joya

现在我想绘制一系列可能的“river_dist”值的预测结果。为此,我创建了一个新数据框:

newdat <- data.frame(river_dist=seq(min(ig$river_dist), max(ig$river_dist),len=100))

并尝试根据模型添加预测值:

newdat$v <- predict(m_r, newdata=newdat, type="response")

但它似乎一遍又一遍地回收相同的四个值(样本很短,但数字不断重复):

> head(newdat)
  river_dist         v
1   475.0000 95.110424
2   480.7071  7.450936
3   486.4141 20.330167
4   492.1212 11.456229
5   497.8283 95.110424
6   503.5354  7.450936

我做错了什么?

编辑:通过在我的模型中将 'ig$river_dist' 更改为 'river_dist',我能够产生看起来像真实的预测,但它们仍然遵循四值循环(每次都有细微的变化) ,在我的图表中产生锯齿形,而不是我期望的斜率或曲线。如果有人能解释原因,我将不胜感激!我的阴谋:

plot(v~river_dist, data=ig, col="red4")
lines(v ~ river_dist, newdat, col="green4", lwd=2)

【问题讨论】:

  • predict(m_r, newdata=newdat, type="response") 仅给出四个值,因此这些值被回收。但是我不知道为什么只有四个值返回,尽管你 newdat 数据框有 100 行,因为我不知道这个包。

标签: r glm predict mle


【解决方案1】:

好的,问题出在公式规范中。尽管您已经指定了 data 参数,但您将 river_dist 变量称为 ig$river_dist。所以拟合过程中使用的变量名与predict函数使用的数据的变量名不匹配。

library(bbmle)

ig <- tibble::tribble(
    ~v,   ~n, ~ig_dist, ~river_dist, ~tam_dist,        ~site,
  102L, 256L,     950L,       1040L,     1040L,     "Boveda",
    1L,  11L,    4800L,        720L,      832L, "Cuchaconga",
   19L,  24L,    2000L,        475L,      475L,   "Ishpingo",
   12L,  15L,    3400L,        611L,      800L,    "La Joya"
  )

m_r <- mle2(ig$v ~ dbinom(size=ig$n, prob = 1/(1+exp(-(a + br * river_dist)))),
            start = list(a = 0, br = 0), data = ig)

newdat <- data.frame(river_dist=seq(min(ig$river_dist), max(ig$river_dist),len=100))

newdat$v <- predict(m_r, newdata=newdat, type="response")

head(newdat$v)

#> [1] 216.855114   9.285536  20.187424  12.571487 213.762248   9.150584

【讨论】:

  • 谢谢!这至少解决了部分问题。这些数字对它们来说仍然有一个古怪的循环(c. 220、c. 9-10、c. 20、c. 12),这在我的情节中创造了疯狂的锯齿形,而不是我期待的平缓曲线。 (我将编辑帖子以显示我的绘图命令)。这可能是我的建模策略的问题,而不是代码本身?有什么想法吗?
  • 是的,我明白了。不抱歉没有想法,对这种建模不熟悉。希望我能帮上忙。也许尝试交叉验证以获得建模部分的帮助。
猜你喜欢
  • 2015-09-01
  • 2012-04-14
  • 2017-02-11
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多