使用glm泊松模型评估足球队实力时遇报错求助
看起来你在尝试用泊松回归建模足球队进球数时踩了个常见的小坑——咱们先拆解下错误和警告:
Error in if (any(y < 0)) stop("negative values not allowed for the 'Poisson' family") : missing value where TRUE/FALSE needed
In Ops.factor(y, 0) : ‘<’ not meaningful for factors
这俩信息其实是同一个问题导致的:你的Goals列被识别成了因子(factor)类型,而泊松回归要求响应变量必须是能做数值比较的非负整数(毕竟进球数是计数数据)。当glm函数试图检查有没有负数时,它没法对因子做<比较,自然就报错了。
一步一步解决:
先确认问题:运行下面的代码看看
Goals列的类型:class(data$Goals)不出意外会返回
"factor"。把因子转成数值型:直接用
as.numeric()转因子可能会出问题(因为因子底层是整数编码),正确的做法是先转成字符再转数值:data$Goals <- as.numeric(as.character(data$Goals))👉 注意:如果你的
Goals因子里混了非数字内容(比如空格、字母),转换后会产生NA值,这时候得先清理这些异常行,比如用na.omit(data)删除缺失值,或者手动修正原始数据。检查数据有效性:转换后确认下有没有负数或者NA:
summary(data$Goals)泊松回归不允许响应变量为负,如果有负数,得排查数据是不是录错了(比如把失球数当成进球数了?)。
重新运行模型:现在再执行你的glm代码应该就没问题了:
model <- glm(Goals ~ Home + Team + Opponent, family=poisson(link=log), data=data)
额外小提示:
下次导入数据时,可以用read_csv()(来自tidyverse的readr包)代替基础的read.csv(),它默认不会把字符列转成因子,能避免这类问题;如果一定要用read.csv(),记得加参数stringsAsFactors=FALSE。
内容的提问来源于stack exchange,提问作者Edgaras Karka

