[R] Error in nlsModel

Belinda Hum Bei Lin belind@hbl @ending from gm@il@com
Mon Oct 8 11:14:41 CEST 2018


Hello,

It is my first time using R studio and I am facing the error of
"Error in nlsModel(formula, mf, start, wts) :
  singular gradient matrix at initial parameter estimates"
when I try to run my script. From what I read online, I understand that the
error might be due to the parameters. However, I do not know how to choose
the right set of parameters. Is there anyone who could advice me on how to
do this?

Below are my script details:
rm(list=ls()) #remove ALL objects
cat("\014") # clear console window prior to new run
Sys.setenv(LANG = "en") #Let's keep stuff in English
Sys.setlocale("LC_ALL","English")

##########
#import necessary packages
#########

##To install the packages use the function install.packages. Installing is
done once.
#install.packages("ggplot2")
#install.packages("minpack.lm")
#install.packages("nlstools")

##Activate the packages. This needs to be done everytime before running the
script.
require(ggplot2)
require(minpack.lm)
require(nlstools)



#########
#define the Weibull function
#########
Weibull<-function(tet1, tet2,x){
  1-exp(-exp(tet1+tet2*log10(x)))
}

#########
##define the inverse of the Weibull function. put in effect and get
concentration as output
#########
iWeibull<-function(tet1,tet2,x){
  10^((log(-log(1-x))-tet1)/tet2)
}


#########
#define the Logit function
#########
Logit<-function(tet1, tet2,x){
  1/(1+exp(-tet1-tet2*log10(x)))
}

#########
##define the inverse of the Logit function
#########
iLogit<-function(tet1,tet2,x){
  10^(-(log(1/x-1)+tet1)/tet2)
}

#########
#define the Probit function
#########
Probit<-function(tet1, tet2, x){
  pnorm(tet1+tet2*(log10(x)))
}

#########
##define the inverse of the Probit function
#########
iProbit<-function(tet1,tet2,x){
  10^((qnorm(x)-tet1)/tet2)
}

#########
# Establish data to fit
# data given here are the data for Diuron from the example datasets
#
# Of course one could also import an external datafile via e.g.
# read.table, read.csv functions

### example to choose a file for import with the read.csv function, where
"," is seperating the columns,
# header=TURE tells R that the first row contains the titles of the
columns, and
# stringsAsFactors = FALSE specify that the characters should not be
converted to factors. For more info run ?read.csv
effectdata<-read.csv(file.choose(),sep=",",stringsAsFactors = FALSE,header
= TRUE)
?read.csv
###

#########
conc<-c(0,
        0,
        0,
        0,
        0,
        0,
        0.000135696,
        0.000135696,
        0.000135696,
        0.000152971,
        0.000152971,
        0.000152971,
        0.000172445,
        0.000172445,
        0.000172445,
        0.000194398,
        0.000194398,
        0.000194398,
        0.000219146,
        0.000219146,
        0.000219146,
        0.000247044,
        0.000247044,
        0.000247044
)

effect<-c(5.342014355,
          13.46249176,
          -9.249022885,
          -6.666486351,
          1.00292152,
          -3.891918402,
          12.63136345,
          -2.372582186,
          8.601073479,
          1.309926638,
          0.772728968,
          -7.01067202,
          30.65306236,
          28.10819667,
          17.94875421,
          73.00440617,
          71.33593917,
          62.23994217,
          99.18897648,
          99.05982514,
          99.2325145,
          100.2402872,
          100.1276669,
          100.1501468
)

#build input dataframe
effectdata<-data.frame(conc,effect)

#plot the data just to get a first glance of the data
ggplot()+
  geom_point(data=effectdata,aes(x=conc,y=effect), size = 5)+
  scale_x_log10("conc")


#delete controls
effectdata_without_controls<-subset(effectdata,effectdata$conc>0)


#save controls in a seperate dataframe called effectdata_control, which
will be added to the ggplot in the end.
#since you can't have 0 on a logscale we will give the controls a very very
low concentration 0.00001 (not 100% correct, but will not be seen in the
final plot)
effectdata_controls<-subset(effectdata,effectdata$conc==0)
effectdata_controls$conc<-effectdata_controls$conc+0.0001



########
#fit data (without controls) using ordinary least squares
#ordinary least squares is a method for estimating unknown parameters in
statistics. The aim of the method is to minimize
#the difference between the observed responses and the responses predicted
by the approximation of the data.
#nlsLM is from the minpack.lm package
#nls=non-linear lest squares
########
nlsLM_result_Weibull<-nlsLM(effect~Weibull(tet1,tet2,conc),
data=effectdata_without_controls, start=list(tet1=1,tet2=1))
nlsLM_result_Logit<-nlsLM(effect~Logit(tet1,tet2,conc),
data=effectdata_without_controls, start=list(tet1=1,tet2=1))
nlsLM_result_Probit<-nlsLM(effect~Probit(tet1,tet2,conc),
data=effectdata_without_controls, start=list(tet1=1,tet2=1))

Thanks a bunch!

Best Regards,
Belinda
Belinda *Hum* Bei Lin (Ms)
National University of Singapore
(e): belindahbl using gmail.com
(c): +6581136079
<+65%208113%206079>

	[[alternative HTML version deleted]]



More information about the R-help mailing list