Jakob Persson (aka solipsist) of NodeOne talks about his early estimation process for scoping out requirements and estimating the number of hours to build a project.
He talks about the process of breaking down the project into discrete features, determining whether or not you've built it before (add in more uncertainty if you haven't), and then estimating the number of hours in a range from high to low. If there are vague requirements, then it's going to add more complexity to the process.
Persson also describes the difference between making agile vs. fixed bids, and the importance of meeting with the client face-to-face in order to understand their requirements and to have the developers be able to ask direct questions. Finally, he mentions some of the most common overlooked things to account for such as testing, deployment, and managing communications with the client.
For more information, be sure to check out Persson's DrupalCon Chicago presentation on "Getting Early Estimates Right." Also be sure to check out Seth Brown's article on The Art of Estimation.