预测范围更广
Predict for wider range
我想拟合数据并预测更宽 x 范围的 y 值。
假设我有 'iris' 数据集,并使用以下数据根据此 post
进行预测
library(dplyr)
cc <- iris %>%
group_by(Species) %>%
do({
mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100))
pred <- predict(mod, newdata =.["Sepal.Width"])
data.frame(., pred)
})
这是拟合图
我想用更宽的 Sepal width
范围拟合此数据,这样
new.range<- data.frame(x=seq(2,10,length.out=20))
并修改脚本
pred <- predict(mod, newdata =new.range)
绘制new.range拟合
library(ggplot2)
ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+
geom_point()+
facet_wrap(~Species)+
geom_line(aes(x=new.range,y=pred),size=1)
Error in (function (..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, : arguments imply differing number of rows:
20, 150
我不明白为什么会出现这个错误。我想 pred
是根据 new.range
计算的,所以它们应该具有相同的长度?
类似帖子
using-predict-in-nls
trouble-with-predict-function-in-r
这就是你想要的东西。你原来的问题的原因是在你的回归中,预测器的名字是 Sepal.width
而不是 x
,你的预测根本没有使用你的 new.range
,所以你必须做一些事情喜欢 new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50))
来预测你的 new.range
。
另一个问题是你必须让 new.range
的长度为 50,这样 pred
和 new.range
才能适合原来的 data.frame。
然后就可以画出你想要的情节了,注意new.range
变成了Sepal.Width.1
。
library(dplyr)
cc <- iris %>%
group_by(Species) %>%
do({
mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100))
new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50))
pred <- predict(mod, newdata =new.range)
# pred <- predict(mod, newdata =.["Sepal.Width"])
data.frame(., new.range, pred)
})
library(ggplot2)
ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+
geom_point()+
facet_wrap(~Species)+
geom_line(aes(x=Sepal.Width.1,y=pred),size=1)
我想拟合数据并预测更宽 x 范围的 y 值。
假设我有 'iris' 数据集,并使用以下数据根据此 post
进行预测 library(dplyr)
cc <- iris %>%
group_by(Species) %>%
do({
mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100))
pred <- predict(mod, newdata =.["Sepal.Width"])
data.frame(., pred)
})
这是拟合图
我想用更宽的 Sepal width
范围拟合此数据,这样
new.range<- data.frame(x=seq(2,10,length.out=20))
并修改脚本
pred <- predict(mod, newdata =new.range)
绘制new.range拟合
library(ggplot2)
ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+
geom_point()+
facet_wrap(~Species)+
geom_line(aes(x=new.range,y=pred),size=1)
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 20, 150
我不明白为什么会出现这个错误。我想 pred
是根据 new.range
计算的,所以它们应该具有相同的长度?
类似帖子
using-predict-in-nls
trouble-with-predict-function-in-r
这就是你想要的东西。你原来的问题的原因是在你的回归中,预测器的名字是 Sepal.width
而不是 x
,你的预测根本没有使用你的 new.range
,所以你必须做一些事情喜欢 new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50))
来预测你的 new.range
。
另一个问题是你必须让 new.range
的长度为 50,这样 pred
和 new.range
才能适合原来的 data.frame。
然后就可以画出你想要的情节了,注意new.range
变成了Sepal.Width.1
。
library(dplyr)
cc <- iris %>%
group_by(Species) %>%
do({
mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100))
new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50))
pred <- predict(mod, newdata =new.range)
# pred <- predict(mod, newdata =.["Sepal.Width"])
data.frame(., new.range, pred)
})
library(ggplot2)
ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+
geom_point()+
facet_wrap(~Species)+
geom_line(aes(x=Sepal.Width.1,y=pred),size=1)