dat<-data.frame(x=c(2,3,4,5,6),y=c(4,4,6,6,10)) N = length(dat$x) x<-dat$x y<-dat$y min.RSS <- function(param1, param2, x, y, N) { beta0 = param1 beta1 = param2 RSS = vector("numeric",length(beta0)) for (i in 1:length(beta0)){ RSS[i] = sum((param1[i]+param2[i]*x-y)^2) } return(RSS) } param1 <- seq(0.1, 1.1, by=0.05) names(param1) <- param1 param2 <- seq(1, 2, by=0.05) names(param2) <- param2 z <- outer(X = param1, Y = param2, FUN = min.RSS, N = N, x = x, y = y) min(z) zd<-data.frame(z) inds = which(zd == min(zd), arr.ind=TRUE) inds (rnames = rownames(zd)[inds[,1]]) (cnames = colnames(zd)[inds[,2]]) require(lattice) wireframe(z, drape=T, xlab="beta0", ylab="beta1", zlab="RSS",col.regions=rainbow(100)) wireframe(z, xlab="beta0", ylab="beta1", zlab="RSS") # test it out min.RSS(param1[3], param2[3], x = x, y = y, N = N) z[3,3]