The path toward a green card is especially difficult for Indian and Chinese who are working in the US and named as EB2 workers, since they have to wait years to submit an i485 form after being approved with their i140 form submission. Once the cutoff date set by USCIS each month catches the priority date that is a date of filling labor certification and decides the position in the long line, the applicants holding their priority date will be able to file the i485 form. However, the cutoff dates are unpredictable for the public, and “it is impossible to accurately estimate how long that may take”.

Situation
The recent cut-off dates data can be copied and pasted from Wiki. Then I adjusted the cut-off dates within the retrogression period. In the past decade, the waiting years range from about 0 year to 4.25 years. July 2007 looks like an amnesty for those who have priory date before that, otherwise people have to wait at least 1.85 years. Applicants from the adjacent 3 or 4 years usually wait in line for the door to be open. The door is recently shut off on June 2012 and hopefully will be open again one day in 2014.

data pd;
input @1 _cmon $3. @5 _cyear $4. @13 _pdmon $3. @17 _pddate : @21 _pdyear $2.;
format c_time pd_time date9.;
c_time = input(cats('01', _cmon, _cyear), date9.);
pd_time = input(cats(_pddate, _pdmon,_pdyear), date9.);
dif_day = c_time - pd_time;
dif_year = dif_day/365;
drop _:;
cards;
May 2012 Aug 15 07
Apr 2012 May 1 10
Mar 2012 May 1 10
Feb 2012 Jan 1 10
Jan 2012 Jan 1 09
Dec 2011 Mar 15 08
Nov 2011 Nov 1 07
Oct 2011 Jul 15 07
Sep 2011 Apr 15 07
Aug 2011 Apr 15 07
Jul 2011 Mar 8 07
Jun 2011 Oct 15 06
May 2011 Jul 1 06
Apr 2011 May 8 06
Mar 2011 May 8 06
Feb 2011 May 8 06
Jan 2011 May 8 06
Dec 2010 May 8 06
Nov 2010 May 8 06
Oct 2010 May 8 06
Sep 2010 May 8 06
Aug 2010 Mar 1 06
Jul 2010 Oct 1 05
Jun 2010 Feb 1 05
May 2010 Feb 1 05
Apr 2010 Feb 1 05
Mar 2010 Feb 1 05
Feb 2010 Jan 22 05
Jan 2010 Jan 22 05
Dec 2009 Jan 22 05
Nov 2009 Jan 22 05
Oct 2009 Jan 22 05
Sep 2009 Jan 8 05
Aug 2009 Oct 1 03
Jul 2009 Jan 1 00
Jun 2009 Jan 1 00
May 2009 Feb 15 04
Apr 2009 Feb 15 04
Mar 2009 Feb 15 04
Feb 2009 Jan 1 04
Jan 2009 Jul 1 03
Dec 2008 Jun 1 03
Nov 2008 Jun 1 03
Oct 2008 Apr 1 03
Sep 2008 Aug 1 06
Aug 2008 Jun 1 06
Jul 2008 Apr 1 04
Jun 2008 Apr 1 04
May 2008 Jan 1 04
Jul 2007 Jul 1 07
Jun 2007 Apr 1 04
May 2007 Jan 8 03
Apr 2007 Jan 8 03
Mar 2007 Jan 8 03
Feb 2007 Jan 8 03
Jan 2007 Jan 8 03
Dec 2006 Jan 8 03
Nov 2006 Jan 8 03
;;;
run;

proc sql;
create table pd1 as
select a.pd_time 'priority date', a.c_time, (select min(c_time) from pd as b
where a.pd_time le b.c_time and a.pd_time le b.pd_time) as i140_submit_date format date9.,
(calculated i140_submit_date - a.pd_time) / 365 as i140_waiting_year
from pd as a
where year(pd_time) gt 2002
order by a.pd_time
;quit;

proc sgplot data = pd1;
series x = pd_time y = i140_submit_date;
xaxis grid;
run;

proc sgplot data = pd1;
series x = pd_time y = i140_waiting_year;
yaxis grid;
run;


Possible change
The cut-off dates much depend on the changes of law and policy which reflects the economic environment. Therefore the US unemployment rate is possibly helpful in predicting the fluctuation of the cut-off dates. First I imported such data, and then transformed the difference between the priority date and the cut-off date to 6-month average. Then the two curves match well. I can even fit the relationship with a simple linear regression. As a conclusion, one percent of unemployment rate decrease may shorten 1/3 year of the waiting time from i140 to i485.

filename _infile url "http://research.stlouisfed.org/fred2/data/UNRATE.txt" debug lrecl=100;
data unempl;
infile _infile missover firstobs = 22;
format date date9.;
input @1 date yymmdd10. @13 unemployement_rate 4.1;
run;

proc sql;
create table combine as
select a.dif_year, b.*
from pd as a, unempl as b
where a.c_time = b.date
;quit;

proc expand data = combine out = combine1 method=none;
convert dif_year = ma_dif_year / transform = (movave 6);
run;

proc sgplot data = combine1;
series x = date y = ma_dif_year;
series x = date y = unemployement_rate;
xaxis grid; yaxis grid label = ' ';
run;

proc reg data = combine1;
model ma_dif_year = unemployement_rate;
ods select ParameterEstimates FitPlot;
run;