R代码拟合正态曲线方法及绘图曲线不显示问题排查
问题排查与解决方案
一、为什么你的拟合曲线没显示?
咱们先拆解你代码里的核心问题:
- 自变量范围完全偏离:你定义的
xx <- seq(1,80, length=3)完全超出了Decline_Category的实际范围(1-3),这会导致预测值对应的x轴位置和原始数据的图表可视区域完全脱节,就算后续代码正常,曲线也看不到。 - 语法错误导致预测失败:
predict(fit, data.frame(=xx))这里缺失了关键的列名!你需要指定数据框的列名为Decline_Category(和线性模型中的自变量名保持一致),也就是写成data.frame(Decline_Category=xx),否则R根本不知道你要给模型传递什么自变量值,预测步骤直接出错,自然画不出曲线。
修正后的线性拟合代码如下:
Decline_Category <- c(1,2,3) Number_of_Trees <- c(80,15,5) # 绘制原始数据点,提前设置y轴范围 plot(Decline_Category, Number_of_Trees, pch=19, ylim=c(0,100)) # 拟合线性模型 fit <- lm(Number_of_Trees ~ Decline_Category) # 生成和自变量范围匹配的x序列(生成100个点让曲线更平滑) xx <- seq(min(Decline_Category), max(Decline_Category), length=100) # 预测并绘制红色拟合曲线 lines(xx, predict(fit, data.frame(Decline_Category=xx)), col="red", lwd=2)
运行这段代码后,红色的线性拟合曲线就会正常显示在你的散点图上了。
二、如何在R中拟合正态曲线?
针对你的数据集(类别+计数),拟合正态曲线分两种常见场景,我分别说明:
场景1:为响应变量拟合正态分布并绘制密度曲线
如果你想探索Number_of_Trees的正态分布特征,可以用直方图搭配正态密度曲线:
# 计算数据的均值和标准差 mu <- mean(Number_of_Trees) sigma <- sd(Number_of_Trees) # 绘制带概率密度的直方图 hist(Number_of_Trees, prob=TRUE, main="正态分布拟合", col="lightblue", border="white") # 生成覆盖数据范围的x序列 x_seq <- seq(min(Number_of_Trees)-5, max(Number_of_Trees)+5, length=100) # 计算正态分布的概率密度值 norm_density <- dnorm(x_seq, mean=mu, sd=sigma) # 绘制红色正态曲线 lines(x_seq, norm_density, col="darkred", lwd=2)
场景2:针对计数数据的更优拟合(替代正态线性模型)
注意:你的Number_of_Trees是计数数据,普通线性模型(lm)基于正态分布假设,并不适配这类数据。更合适的是用泊松回归(基于泊松分布,专门针对计数响应变量):
# 拟合泊松回归模型 poisson_fit <- glm(Number_of_Trees ~ Decline_Category, family=poisson) # 绘制原始数据点 plot(Decline_Category, Number_of_Trees, pch=19, ylim=c(0,100)) # 生成x序列并预测响应值 xx <- seq(min(Decline_Category), max(Decline_Category), length=100) preds <- predict(poisson_fit, data.frame(Decline_Category=xx), type="response") # 绘制绿色拟合曲线 lines(xx, preds, col="darkgreen", lwd=2)
这种模型的预测结果会更符合计数数据的特性,比正态线性模型更合理。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

