我正在使用PopulationGrowth.csv编写以下脚本:
dat <-read.csv("/Path/PopulationGrowth.csv")
class = "data.frame", row.names=c(NA,-16L)
m1 <- nls(pop~SSlogis(Year,asym,xmid,scal),data=dat)
par(las=1,bty="l",mar=c(5,6,2,2)+0.1) ## graphics tweaks
with(dat,plot(CentralOakland~Year,ylab=""))
mtext("Population",side=2,las=0,line=4)
yearvec <- 1940:2010
lines(yearvec,predict(m1,newdata=data.frame(Year=yearvec)))
在最后一行之后,我收到以下错误:
Error in predict(m1, newdata = data.frame(Year = yearvec)) : object 'm1' not found
以下是我正在使用的数据:
Year CentralOakland
1940 7852
1950 8452
1960 6701
1970 6135
1980 5872
1990 5406
2000 5281
2010 6086
我还试图预测未来30年的人口趋势。有理由相信人口将在未来30年内增加。预测这个有什么功能?
忍受我,我是R的新手。
答案 0 :(得分:6)
这里有一些小问题:
read.csv
而不是read.table
quartz=(title...)
在做什么。也许quartz(title=...)
?无论如何,使用plot()
应该会自动打开一个新的图形窗口attach
通常是一个坏主意lines
而不是curve
将新的(例如)预测数据集添加到绘图中。对于线性回归的特定情况(请参阅下一点),您可以使用abline
。glm
来拟合一个普通的线性模型(最小二乘回归),它可以也可以通过lm()
更轻松地实现。 Logistic回归将使用family=binomial
而不是family=gaussian
。此外,逻辑回归是针对二元响应变量的,所以它不太适合对中奥克兰的人口进行建模 ...我怀疑你混淆了后勤回归和物流增长曲线 ...... 以下是一些修改后的代码:
dat <- read.csv("/Path/PopulationGrowth.csv")
with(dat,plot(Year,CentralOakland,xlab="Year",ylab="Population",
main="Central Oakland Population vs. Year"))
g <- lm(CentralOakland~Year,data=dat)
abline(g)
## OR
yearvec <- seq(min(Year),max(Year),length=51)
lines(yearvec,predict(g,newdata=data.frame(Year=yearvec),type="response"))
另一方面,也许这就是你真正想要做的事情(你没有给我们数据,所以我去了维基百科并得到了一些......)
## from http://en.wikipedia.org/wiki/Oakland,_California
dat <- structure(list(year = c(1860L, 1870L, 1880L, 1890L, 1900L, 1910L,
1920L, 1930L, 1940L, 1950L, 1960L, 1970L, 1980L, 1990L, 2000L,
2010L), pop = c(1543L, 10500L, 34555L, 48682L, 66960L, 150174L,
216261L, 284063L, 302163L, 384575L, 367548L, 361561L, 339337L,
372242L, 399484L, 390724L)), .Names = c("year", "pop"),
class = "data.frame", row.names = c(NA,-16L))
小配件:
## SSlogis() is a "self-starting" logistic
m1 <- nls(pop~SSlogis(year,asym,xmid,scal),
data=dat)
绘图:
par(las=1,bty="l",mar=c(5,6,2,2)+0.1) ## graphics tweaks
with(dat,plot(pop~year,ylab=""))
## add y-label separately
mtext("population",side=2,las=0,line=4)
yearvec <- 1860:2010
lines(yearvec,predict(m1,newdata=data.frame(year=yearvec)))