2016-11-22 57 views
2

Link to dataset`predict.nls`回報在指定`newdata`

定義的參數擬合值,而不是預測:

M <- maximum.oxygen.uptake 
m <- mass 
a <- age 
s <- sex 
v <- as.numeric(vigorous.exercise>0) 
sv <- s*v 
asv <- a*s*v 
as <- a*s 
av <- a*v 
lnm=log(m) 
lnms <- log(m)*s 
lnmv <- log(m)*v 
lnmsv <- log(m)*s*v 
y <- M/m^(2/3) 

我適合成功使用nls型號:

nls.full <- nls(M ~ (m^(alpha0 + alpha1 * s + alpha2 * v + alpha3 * s * v)) * 
       (beta0 + beta1 * s + beta2 * v + beta3 * sv + 
       a * gamma0 + gamma1 * as + gamma2 * av + gamma3 * asv), 
       trace=TRUE, 
       start=list(alpha0=2/3, alpha1=0, alpha2=0, alpha3=0, 
          beta0=est[1], beta1=est[2], beta2=est[3],beta3=est[4], 
          gamma0=est[5],gamma1=est[6],gamma2=est[7],gamma3=est[8])) 

問題:無法預測

xpredict <- seq(10,120,length.out=300) 
data1 <- data.frame(a=35,s=0,v=1,m=seq(10,120,length.out=300)) 
ypredict <- predict(nls.full, newdata=data1, type="response") 
plot(log(maximum.oxygen.uptake) ~ log(mass), subset = (s=='0' & v=='1')) 
lines(xpredict,ypredict) 

y和x的長度不同。

我不明白爲什麼它應該,我定義了一個新的數據框與300變量,我應該只有300個結果在y預測。

回答

2

你的問題增加了一個關於使用predict的重要案例研究,目前這個網站上沒有(據我所知),因此我沒有像往常那樣將其重複關閉。


這個簡單的例子就足以說明你的問題是什麼:

set.seed(0) 
x <- runif(50) 
y <- runif(50) 
## true model 
z <- exp(4 * x - x * y) + sin(0.5 * y) + rnorm(50) 

我們可以配合由非線性迴歸模型:

fit1 <- nls(z ~ exp(a * x + b * x * y) + sin(c * y), 
      start = list(a = 3, b = 0, c = 1)) 

xy <- x * y  
fit2 <- nls(z ~ exp(a * x + b * xy) + sin(c * y), 
      start = list(a = 3, b = 0, c = 1)) 

但是,當makin時要小心g預測predict

newdat <- data.frame(x = runif(2), y = runif(2)) 
pred1 <- predict(fit1, newdat) 
# [1] 19.476569 2.870397 

pred2 <- predict(fit2, newdat) 
#[1] 12.205215 2.900922 16.675160 2.588310 18.466907 3.221744 21.207958 
#[8] 2.478375 16.294230 2.230084 22.675165 2.741694 22.053141 2.441442 
#[15] 20.378554 2.069649 20.362845 2.380586 10.570350 3.168567 11.477691 
#[22] 2.438041 19.336928 2.648129 22.282448 2.899636 16.264152 3.229857 
#[29] 19.928498 1.779721 16.563424 2.688125 14.925190 2.718176 21.853093 
#[36] 1.856641 20.213350 1.957830 22.960452 2.767944 21.890656 2.719899 
#[43] 22.370200 2.066384 14.061771 2.237771 12.102094 3.232742 18.985547 
#[50] 1.909355 

predict.nls不會發出像什麼predict.lmpredict.glm做任何警告(Getting Warning: 「 'newdata' had 1 row but variables found have 32 rows」 on predict.lm in R)。基本上,你必須提供你的擬合公式中使用的所有變量。請注意,xy也是一個變量:

newdat$xy <- with(newdat, x * y) 
pred2 <- predict(fit2, newdat) 
# [1] 19.476569 2.870397