2012-05-06 110 views
2

我寫使用PopulationGrowth.csv以下腳本:錯誤代碼logistic迴歸

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.

+1

應該不是你的迴歸公式是'CentralOakland〜Year'(與變量來預測左側) ? –

+0

謝謝,我沒有意識到這一點。 – H3lue

回答

6

有一些小故障的位置:

  • 你沒有給我們一個重複的例子:例如見http://tinyurl.com/reproducible-000 ...
  • 你可能想read.csv而不是read.table
  • 我不知道是什麼quartz=(title...)在做什麼。也許quartz(title=...)?在任何情況下,使用plot()應該使用attach往往是一個壞主意
  • 使用lines,而不是curve添加一個新的(例如)預測的數據設置爲一個情節自動打開一個新的圖形窗口
  • 。對於線性迴歸的具體情況(見下一點),您可以使用abline
  • 迄今爲止最重要的是:你在做什麼這裏 logistic迴歸 - 它使用glm,以適應普通線性模型(最小二乘迴歸),也可通過lm()更容易實現。邏輯迴歸將使用family=binomial而不是family=gaussian。此外,logistic迴歸是用於二元響應變量,所以它不可能適合中央奧克蘭的人口造型......我懷疑你是在混淆一個邏輯迴歸和後勤增長曲線 ...

下面是一些修改代碼:

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))) 

enter image description here

+0

感謝您的幫助!但是,主窗口說在init_abline中有一個錯誤,因爲plot.new尚未被調用。 此外,如果邏輯斯蒂模型不適合使用,您建議使用哪種模型來模擬人口增長/衰減/波動?我正在尋找比線性更準確的擬合... – H3lue

+0

您是否運行了上面的'plot'命令?你應該用什麼樣的模型來進行人口增長(指數,邏輯等)取決於很多因素。您可能正在尋找'SSlogis()'和'nls()'函數...請重新閱讀上面關於**可重現**示例的代碼... –

+0

@ H3lue,我在堆棧溢出中看到了您的問題/ R聊天室從昨天開始。如果我上面提供的答案不清楚,歡迎您在這裏發表評論,或編輯您的問題以提供更多信息。 –