2017-06-29 73 views
0

我想擬合更寬的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) 
    }) 

使用下面的數據進行預測這是擬合圖

enter image description here

我想,以配合這個數據更寬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) 

錯誤(...,row.names = NULL,check.rows = FALSE, check.names = TRUE,:參數意味着不同的行數: 20,150

我不明白爲什麼要這樣做錯誤。我想prednew.range計算,所以他們應該有相同的長度?

類似的帖子

using-predict-in-nls

trouble-with-predict-function-in-r

predict-maybe-im-not-understanding-it?

+0

你需要調用'cc $ mod'而不是mod嗎? – troh

+0

@troh當我嘗試cc $ mod時,'預測中的錯誤(mod,newdata = new.range):object'mod'not found' – Alexander

回答

1

這是東西,達到你想要的。原始問題的原因是,在您的迴歸中,預測的名稱是Sepal.width而不是x,而您的預測完全不使用您的new.range,因此您必須執行類似new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50))的操作來對您的new.range進行預測。

另一個問題是,你必須使new.range的長度爲50,以便prednew.range適合原始數據幀。

然後你可以畫出你想要的圖,注意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) 
+0

感謝您的好評。 OTH,在我的實際數據中,每個組的長度都不相同!在虹膜數據集中,每個物種有50行。這很好,當我們設置length.out = 50。但是,在我的真實數據中,有一些行的大小爲100或160.所以我不能爲他們使用相同的'length.out'參數。你有什麼建議嗎? – Alexander

+1

@亞歷山大不客氣。如果行大小不同,可以用'nrow(。)'替換50,這應該可以工作。 – Consistency

+0

再次感謝。它效果很好! – Alexander