我在R herehere中看到了几个关于计算MSE的问题,但它们没有回答我的问题.我试着用伽玛分布的glm(所以,伽玛回归),试着用两种不同的方法计算模型的均方误差.以下是MWE:

set.seed(39756934)                           
x = rnorm(100)
y = rnorm(100) + 0.5 * x + 3  # Need the +3 for strictly positive y values.
my_data = data.frame(x, y)
my_mod = glm(y~x, data=my_data, family=Gamma())  # Default link is "inverse"
mean(my_mod$residuals^2)
    0.01388825
mean((my_data$y - predict(my_mod))^2)
    6.954654

使用日志(log)链接给出不同的数字,但这两种方法仍然不一致.

据我所知,这两种方法应该得到相同的结果,但显然不是.怎么回事?是不是哪里有窃听器?或者,这些计算MSE的方法之一对于Gamma回归来说是错误的?

我认为这个问题不属于CrossValiate.SE,因为它更多的是一个代码/编程的问题--除非答案是这些计算MSE的方法之一对于Gamma回归是无效的.但我事先不知道.这个问题肯定会在CrossValiate.SE上结束.

推荐答案

指定type="Response",因为可以考虑线性预测器或响应表上的残差和预测.

mean(resid(my_mod, type = "response")^2)
## [1] 0.7419272

mean((my_data$y - predict(my_mod, type = "response"))^2)
## [1] 0.7419272

type=有几种不同的可能性,如下所示,但在这两种情况下都只有"Response"可用

p.type <- c("link", "response", "terms")
r.type <- c("deviance", "pearson", "working", "response", "partial")
 
sapply(r.type, \(x) mean(resid(my_mod, type = x)^2))
##   deviance    pearson    working   response    partial 
## 0.10746632 0.09651097 0.01388825 0.74192724 0.01685553 


sapply(p.type, \(x) mean((my_data$y - predict(my_mod, type = x))^2))
##      link  response     terms 
## 6.9546540 0.7419272 8.8680964 

R相关问答推荐

在Julia中调用R函数

如何使用stat_extract_all正确提取我的目标值?

lightgbm发动机在tidymmodels中的L1正则化""

如何使下一个按钮只出现在Rshiny 的一段时间后?""

是否可以创建一个ggplot与整洁判断的交互作用

将小数分隔符放在R中的前两位数字之后

如何对2个列表元素的所有组合进行操作?

Select 季度月值

将Posict转换为数字时的负时间(以秒为单位)

将一个字符串向量调整为与其他字符串向量完全相同的大小

按多列统计频次

如何在使用箭头R包(箭头::OPEN_DATASSET)和dplyr谓词时编写具有整齐计算的函数?

在使用具有Bray-Curtis相似性的pvCluust时计算p值

我如何使用循环来编写冗余的Rmarkdown脚本?

根据r中另一个文本列中给定的范围对各列求和

TidyVerse中长度不等的列结合向量

R-找出存在其他变量的各种大小的所有组合

R将函数参数传递给ggploy

在鼠标悬停时使用Plotly更改geom_point大小

在具有条件的循环中添加行