R pred () function returns wrong / too many values
I am trying to convert the Absorbance (Abs) values to concentration (ng / ml) based on an established linear model and a standard curve. I was planning to do this using the pred () function. I am having trouble getting the prediction () to return the results I want. Here's an example of my code:
Standards<-data.frame(ng_mL=c(0,0.4,1,4),
Abs550nm=c(1.7535,1.5896,1.4285,0.9362))
LM.2<-lm(log(Standards[['Abs550nm']])~Standards[['ng_mL']])
Abs<-c(1.7812,1.7309,1.3537,1.6757,1.7409,1.7875,1.7533,1.8169,1.753,1.6721,1.7036,1.6707,
0.3903,0.3362,0.2886,0.281,0.3596,0.4122,0.218,0.2331,1.3292,1.2734)
predict(object=LM.2,
newdata=data.frame(Concentration=Abs[1]))#using Abs[1] as an example, but I eventually want predictions for all values in Abs
Running these last lines gives this output:
> predict(object=LM.2,
+ newdata=data.frame(Concentration=Abs[1]))
1 2 3 4
0.5338437 0.4731341 0.3820697 -0.0732525
Warning message:
'newdata' had 1 row but variables found have 4 rows
This doesn't sound like the result I want. I am trying to get one predicted concentration value for each Absorbance (Abs) record. It would be nice to predict all the records at once and add them to the existing dataframe, but I can't even get it to give me one value correctly. I've read a lot of threads here, web pages found on google and all the help files, and for the life of me I can't figure out what's going on with this feature. Any help would be appreciated, thanks.
source to share
You must have a variable in newdata
that has the same name as the model formula used to initially fit the model.
You have two errors:
- You are not using a variable in
newdata
with the same name as the covariate used to match the model, and - You make it difficult to solve the problem because you are overusing the formula interface.
Don't match your model as follows:
mod <- lm(log(Standards[['Abs550nm']])~Standards[['ng_mL']])
suitable for your model as follows
mod <- lm(log(Abs550nm) ~ ng_mL, data = standards)
Isn't that too readable?
For prediction, you need a data frame with a variable ng_mL
:
predict(mod, newdata = data.frame(ng_mL = c(0.5, 1.2)))
You may now have a third error. You seem to be trying to predict with new values of Absorbance, but the way you fit the model, Absorbance is the answer variable. You will need to provide new values for ng_mL
.
The behavior you see happens when R cannot find a correctly named variable in newdata
; it returns set values from a model or prediction from observed data.
This makes me think you have a back formula. Did you mean:
mod2 <- lm(ng_mL ~ log(Abs550nm), data = standards)
?? In this case, you will need
predict(mod2, newdata = data.frame(Abs550nm = c(1.7812,1.7309)))
say. Note that you do not need to include the bit log()
in the name. R recognizes this as a function and refers to the variable Abs550nm
for you.
If the model is valid log(Abs550nm) ~ ng_mL
and you want to find values ng_mL
for the new values Abs550nm
, you need to invert the established model somehow.
source to share