【问题标题】:Error in code for logistic regression逻辑回归代码错误
【发布时间】:2012-05-06 23:11:02
【问题描述】:

我正在使用 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 新手。

【问题讨论】:

  • 你的回归公式不应该是CentralOakland ~ Year(要预测的变量在左边)吗?
  • 谢谢,我不知道。

标签: r regression curve-fitting


【解决方案1】:

这里有一些小故障:

  • 你没有给我们一个可重现的例子:参见例如http://tinyurl.com/reproducible-000 ...
  • 你可能想要read.csv而不是read.table
  • 我不知道quartz=(title...) 在做什么。也许quartz(title=...)?无论如何,使用plot() 应该会自动打开一个新的图形窗口
  • 使用attach 通常是个坏主意
  • 使用lines 而不是curve 将新的(例如)预测数据集添加到绘图中。对于线性回归的具体情况(见下一点),您可以使用abline
  • 到目前为止最重要的是:您在这里所做的不是逻辑回归 - 它使用 glm 来拟合普通线性模型(最小二乘回归),也可以是通过lm() 更容易实现。逻辑回归将使用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)))

【讨论】:

  • 感谢您的帮助!但是,主窗口显示 init_abline 中存在错误,因为尚未调用 plot.new。此外,如果逻辑模型不适合使用,您建议使用哪种模型来模拟人口增长/衰减/波动?我正在寻找比线性更准确的拟合...
  • 您是否运行了上面的plot 命令?您应该使用哪种模型来进行人口增长(指数、逻辑等)取决于很多因素。您可能正在寻找 SSlogis()nls() 函数...请重新阅读上面关于 reproducible 示例的部分...
  • @H3lue ,我昨天在 Stack Overflow/R 聊天室看到了你的问题。如果您对我上面提供的答案不清楚,欢迎您在这里发表评论,或编辑您的问题以提供更多信息。
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 2019-10-31
  • 2016-02-21
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多