[R] Help me to migrate from SAS
Jose A. Hernandez
jahernan at umn.edu
Tue Nov 23 22:18:18 CET 2004
R-community,
Assuming a file with 3 columns: site, nrate, yield. In SAS I can easily
run the analysis BY SITE using the following code:
*--------------------------------------------------*;
proc nlin method=MARQUARDT;
by farm;
parms b0=100 b1=0.33 b2=-0.00111 x0=120;
model yield = (b0 + b1 * nrate + b2 * nrate * nrate) * (nrate <= x0) +
(b0 + b1 * x0 + b2 * x0 * x0) * (nrate>x0);
output out=out predicted=pred ess=rss parms=b0 b1 b2 x0;
*--------------------------------------------------*;
In R I tried using nls in a loop, but it appears the analysis is very
sensitive to the initial values and I keep getting the "singular
gradient matrix at initial parameter estimates" error.
Any ideas on how to work around this issue would be greatly appreciated.
Thanks,
# Example data
site <- c(1,1,1,1,1,1,2,2,2,2,2,2)
nrate <- c(0,60,90,120,150,180,0,60,90,120,150,180)
yield <-
c(161.7,187.1,188.5,196.6,196.0,196.5,160.7,186.1,189.5,194.6,195.0,198.5)
site <- as.factor(site)
bar_1 <- NULL
for (i in 1:length(levels(site))) {
j <- site == levels(site)[i]
x <- nrate[j]
y <- yield[j]
nls.st <- list(b0=140, b1=0.5, b2=-0.002, x0=125)
out<- try(nls(y ~ (b0 + b1*x + b2*I(x^2))*(x <= x0)
+ (b0 + b1*x0 + b2*I(x0^2))*(x > x0),
start = nls.st))
fit1 <- summary(out)$parameters
qp.resi <- summary(out)$residuals
rss <- sum(qp.resi^2)
bar_1 <- rbind(bar_1, c(i, fit1[1, 1:2], fit1[2, 1:2], fit1[3,
1:2],
fit1[4, 1:2], rss))
}
dimnames(bar_1) <- list(NULL, c("Site", "b0", "s.e.", "b1", "s.e.",
"b2", "s.e.", "x0", "s.e.", "RSS"))
print(bar_1)
More information about the R-help
mailing list