如何在R中基于水深建立海豚出现情况的二项式GLM模型?
代码验证与绘图问题解决
数据样本
部分水深与海豚出现情况数据:
| Depth | presence |
|---|---|
| 8 | 0 |
| 31 | 1 |
| 31 | 1 |
| 29 | 0 |
原代码问题排查
你写的代码存在几处需要修正的细节:
read.csv的文件名未加引号,R会将其识别为变量而非文件路径,需改为read.csv("presence.data.csv", header=TRUE)。- 列名不匹配:数据表头是
Depth.(带点),但代码中用的是depth,大小写和符号不一致会导致模型无法找到对应列,需统一两者。 - 仅绘制了散点,未添加GLM模型的拟合曲线,这是你所说“无法添加(拟合线)”的核心问题。
修正后的完整代码
# 读取数据,注意文件名加引号 data <- read.csv("presence.data.csv", header=TRUE) # 统一列名(也可直接在后续代码中使用原表头Depth.) colnames(data) <- c("depth", "presence") # 确保presence列是整数类型(处理数据中可能存在的格式问题) data$presence <- as.integer(data$presence) # 构建二项式GLM模型 M1 <- glm(presence ~ depth, family=binomial) # 生成预测序列 x <- seq(min(data$depth), max(data$depth), length.out=100) y <- predict(M1, list(depth=x), type=response) # 绘制散点图并添加拟合曲线 plot(data$depth, data$presence, pch=16, xlab="水深", ylab="海豚出现概率", main="水深与海豚出现关系") lines(x, y, col="red", lwd=2)
关键说明
- 列名一致性:必须保证代码中调用的列名与CSV文件表头完全一致,若表头是
Depth.,则将代码中所有depth替换为Depth.即可。 - 拟合曲线添加:通过
lines()函数将预测的x(水深序列)和y(预测出现概率)绘制到散点图上,就能得到GLM模型的拟合曲线。 - 数据清洗:提前转换
presence列为整数类型,避免数据中类似1.的格式问题影响模型构建。
内容的提问来源于stack exchange,提问作者Amy Bethan
相关产品推荐
相关产品推荐

