From[Bill Williams 22 February 2004 4:00 PM CST]
Bjorn,
As long as I am going to describe the Veblen/Duessenberry effect
program I might as well post the description and narrative to the
CSGnet.
The process that has become known as the Veblen-Duessenberry
effect involves a difference between the behavior of a consumer
in reaction to an increase in income, to a consumer faced with
a decrease in income. When I thought about this, from the
standpoint of control theory it seemed to me that what was
involved was a conflict between a consumer’s desired level of
consumption and the level of consumption that the consumer’s
budget would support. This isn’t an unusual condition for a
consumer in a mass-market capitalist society to experience.
So, I set up a consumer with a budget and a reference level
for consumption. If I set the level of consumption to be twice
the budget then two identical control loops would pull against
each other and the consumer would spend 50 percent more than
the budget. So, I put an integration step in the budget control
loop, and over time the integrating step resulted the consumer
settling down to spending no more than the budget.
However, if the consumer’s budget was suddenly increased it
was like the budget control loop vanished, and the consumer
reacted quickly by increasing spending rapidly.
However, when the budget was suddenly decreased the consumer
started decreasing spending, but, the decrease takes place as
a result of a conflict between the consumption and budget loops.
As a result of this conflict, the decrease in consumption takes
place more slowly than the increase in consumption when the budget
is suddenly increased.
Using the 200 data points from 1950 - 2000 their were five or
six rather sharp changes in income. Averaged the numbers came
out where the Veblen-Duessenberry model would predict. What
may be needed is individual data for consumers. And, the standard
statistical packages seem to make the assumpti0n that the process
considered is ergodic, and the VEblen-Duessenberry model doesn’t
assume that the process of increasing income is the same as the
process of decreasing income.
There are some minor variations in the way the program behaves
when making upward as opposed to downward adjustments. On the
upward adjustment there is a minor overshoot that takes place
when the consumer, while rapidly increasing expenditure catches
up to the increase in income. This overshoot doesn’t occur for
the downward adjustment. The difference is that the budget loop
doesn’t kick in on the upward adjustment until the consumer
exceeds the budget. While on the downward adjustment the consumer
is-- the whole time – experiencing a conflict between the two
control loops-- the budget and the consumption loop. And, on the
downward adjustment which is driven by the integration terms, the
consumer approaches the budget asymptotically.
The structure of the model is really simple, If you want to send
me your surface mail address I’ll send you Execute code so you can
see the program run. I can’t seem to send Execute code over the
university system any more. Putting funny names on the programs
used to work, but now the university seems to check the actual
code. If I thought about what they were doing, I could probably
find a way around what they are doing, but it seems easier for
me to just send stuff surface mail.
You can download Turbo Pascal 5.5 which will compile nearly all or
all the code I write from several places on the web.
If you want to run Turbo Pascal code, there are ways that you can
do it.
In the following I’ve include references and some comments about
VEblen and control theory
Veblen in the third part of his essay, "The Preconceptions of
Economic sciences states,
"The ultimate term or ground of knowledge is always
of a metaphysical character. It is something in the way
of a preconception, accepted uncritically, but applied
in criticism and demonstration of all else with which the
science is concerned. So soon as it comes to be criticized,
it is in a way to be superseded by a new, more or less
altered formulation: for criticism of it means that it is
no longer fit to survive unaltered in the altered complex
of habits of thought to which it is call upon to serve as
a fundamental principle. It is subject to natural selection
and selective adaptation, as are other conventions. The
underlying metaphysics of scientific research and purpose,
therefore changes gradually and, of course, incompletely,
much as is the case with the metaphysics underlying the
common law, and the schedule of civil rights. p. 149.
Coats, A. W. 1954 “The Influence of Veblen’s Methodology.”
Journal of Political Economy vol 62 # 6 December p 529-37.
One of the preconceptions to which Veblen paid close attention
were the psychological assumptions underlying economic theory.
I am of the opinion that Veblen’s work contains an anticipation
of a a control theory conception of behavior.
And, I have been at work collecting evidence to this effect.
See
Leibenstein, Harvey. 195O "Bandwagen, Snob, and Veblen Effects
in the Theory of Consumer’s Demand." Quarterly Journal of
Economics
Reisman, David. 1960 Thorstein Veblen: a Critical Interpretation
New York: Charles Scribner’s son’s
Veblen … had begun by interpreting adaptation as adaptation of
the environment to human activity rather than the reverse. p. 58.
Reisman’s description seems to me to indicate that Veblen was not
as many of his contemporaries were-- a behaviorist in the sense of
the Behavorism of John Watson, et al.
Rutherford, M 1988 "Veblen’s Evolutionary Programme: A Promise
Unfufilled. Cambridge Journal of Economics July vol 22 # 4
p 463-77.
Institutionalism in the interwar period is devoid of
attempts to develop Veblen’s theory, and Veblen’s programme
remained a promise unfilled. p. 463.
Veblen’s program “… ultimately failed.” p. 464.
This has been the case largely I believe because in the absence of
an understanding of control theory Veblen’s discussion of human
behavior doesn’t make a lot of sense.
Hodgson, G. M. 1998 “Thorstein Veblen’s Evolutionary Economics.” CJE
vol 22
"Under the resolute leadership of Clarence Ayres (1944), IE
evolutionism was severed from biology and its socio-economic theory
downplayed the role of individual agency. "
Those who attempted to interprete Veblen frequently adopted the
psychology of behaviorism, and favored cultural rather than
psychological explainations.
McCormick 1983 “Veblen and Dussenbery effect”
Journal of Economic Issues vol 17 # 4 December
Gambs, John S. 1975 John Kenneth Galbraith
Boston; Hall & Company
chapter title “Forces that Molded Galbraith’s Thinking”
p. 34.
"Standard economic theorists have little patience
with psychology. They concede that Economics is a behavioral
science but do not allow that knowledge to bother them too
much. One of them has even asked whether when some
psychologist comes up with some new idea, the time-tested
theories of economics must be rewritten. Of course the
onward march of scientific discovery often invalidates
previous discovery and often affects sciences other
than those in which the new discovery is made. p. 34.
"There may be exceptions to all this, they concede, but the less
said about them the better.
No such simple do-it-yourself psychological principles can be
disengaged from Veblen and Galbraith, p. 34.
I, however, do think that Veblen’s program fits with control theory.
Seckler, David. 1962 "Thorstien Veblen and the Foudations of
Institutional Economics." Unpublished Doctoral Dissertation,
University of London, London School of Economics
Seckler, David William, 1962 _Thorstein Veblen and the Foundations
of Institutional Economics_ Unpublished Dissertation, University
of London, London School of Economics, May 1962
p. " … Veblen fails to explain (systematically) anything and this,
in the last analysis is the true ‘secret of Veblen.’" p. 134.
" [the fact remains] … that it is impossible to construct a
systematic theory, consistent with any of Veblen’s major
concepts, out of the best of Veblen." p. 146.
Campbell, Colin 1995 "Conspicious Confusion? A Critique of Veblen’s
Theory of the Conscpicious Consumption" Sociological Theory
Vol 13 # 1 March p. 37-47.
People could become very frustrated when Veblen didn’t do thinks
the way they thought he should. Witness Seckler in the above.
Doug, Brown. editor 1998 _Thorstein Veblen in the Twenty-First
Century:A Commemoration of the Theory of the Leisure Class
(1899-1999)
Edward Elgar: Cheltenham, Uk
Noyes, C. Reinold. 1948 _Economic Man in relation to his Natural
Environment_ New York: Columbia University Press
p. 996. "A Study of this kind does not lend itself to any
succinct summary. The conclusions are all tentative and they
strew themselves along the whole process of examining the
evidence. Nevertheless
1. Organisms, including man, are no reaction-mechanisms for
response to enivornmental stimuli.
Some economists were critical of behavorism fairly early on.
Gambs, John. Beyond Supply and Demand 1947
“Veblen deserves his john Stuart Mill.” p. 89-90
Mill took the rather inaccessible classical texts in econmics and
brought out much more accessible texts. However, in the absence
of control theory I don’t think VEblen’s stuff makes much sense.
···
Program Bjorn { 22 Feburary 2OO4 }
{ program VD5; (* 11 August 2001 W.D. Williams UMKC *) }
uses
dos, crt, graph, grutils;
var
qi, p,r,e,o, disturbance :real;
p2, r2, e2, o2 : real;
p3, e3, o3 : real;
e4, o4 : real;
e5, o5 : real;
gain, slow, damping, d gain2, slow2 :real
cycle, b, bes, be, bi, bg, cl, bl : real;
b2, bes2, be2, bi2, bg2, cl2, bl2 : real;
b3, bes3, be3, bi3, cl3, bl3 : real;
b4, bes4, be4, bi4, cl4, bl4 : real;
b5, bes5, be5, bi5, cl5, bl5 : real;
step, length, jump, jump2, jump3 , jump4, jump5 : real;
key : char;
i, c, rep, space, count : integer;
{ Each controller 1 - 5 represents an individual economic agent }
procedure controller1;
begin
e := r - o; {Error Consumption = Reference Level - Perceieved Output }
be := b - o; {Error Budget = Budget - Expenditure }
if be > 0 then { if expenditure is less than the budget reduce the }
{ existing budget error by a fraction on each cycle }
begin
be := 0;
bi:= bi - bi/ ( damping ) ;
end
else { if expenditure is more than the budget add to the budget }
{ integrated error a fraction of the current error }
begin
bi := bi + be/( damping );
end;
cl := ( gain * e - o)/slow; { slowing proceedure to stablize loop }
bl := ( bg * bi - o)/slow; { slowing proceedure to stablize loop }
o := o + cl + bl; { add the action of the budget and }
end; { consumption loops to get total expenditure}
procedure controller2;
begin
e2 := r - o2;
be2 := b2 - o2;
if be2 > 0 then
begin
be2 := 0;
bi2 := bi2 - bi2/ damping ;
end
else
begin
bi2 := bi2 + be2/damping ;
end;
cl2 := ( gain * e2 - o2)/slow;
bl2 := ( bg * bi2 - o2)/slow;
o2 := o2 + cl2 + bl2;
end;
procedure controller3;
begin
e3 := r - o3;
be3 := b3 - o3;
if be3 > 0 then
begin
be3 := 0;
bi3 := bi3 - bi3/ damping ;
end
else
begin
bi3 := bi3 + be3/damping ;
end;
cl3 := ( gain * e3 - o3)/slow;
bl3 := ( bg * bi3 - o3)/slow;
o3 := o3 + cl3 + bl3;
end;
procedure controller4;
begin
e4 := r - o4;
be4 := b4 - o4;
if be4 > 0 then
begin
be4 := 0;
bi4 := bi4 - bi4/ damping ;
end
else
begin
bi4 := bi4 + be4/damping ;
end;
cl4 := ( gain * e4 - o4)/slow;
bl4 := ( bg * bi4 - o4)/slow;
o4 := o4 + cl4 + bl4;
end;
procedure controller5;
begin
e5 := r - o5;
be5 := b5 - o5;
if be5 > 0 then
begin
be5 := 0;
bi5 := bi5 - bi5/ damping ;
end
else
begin
bi5 := bi5 + be5/damping ;
end;
cl5 := ( gain * e5 - o5)/slow;
bl5 := ( bg * bi5 - o5)/slow;
o5 := o5 + cl5 + bl5;
end;
procedure display1;
begin
putpixel(round(i/2),vcenter - round(r), yellow);
putpixel(round(i/2),vcenter - round(o5 ), lightred );
putpixel(round(i/2),vcenter - round(b5 ), lightgray );
putpixel(round(i/2),vcenter - round(o4 ), lightred );
putpixel(round(i/2),vcenter - round(b4 ), lightgray );
putpixel(round(i/2),vcenter - round(o3 ), lightred );
putpixel(round(i/2),vcenter - round(b3 ), lightgray);
putpixel(round(i/2),vcenter - round(o2 ), lightred);
putpixel(round(i/2),vcenter - round(b2 ), lightgray);
putpixel(round(i/2),vcenter - round(o), lightred);
putpixel(round(i/2),vcenter - round(b), lightgray);
end;
procedure set_variable_values;
begin
disturbance := 0;
bg := 7; (* budget gain *)
gain := 10; (* consumption gain *)
bg2 := 7;
gain2 := 10;
be := 0;
be2 := 0;
slow := 60;
slow2 := 60;
damping := 80;
count := 1;
rep := 1;
step := 200;
length := 600;
bi := 100;
bi2 := 100 ;
jump := -50;
jump2 := -75;
jump3 := -100;
jump4 := -125;
jump5 := -150;
b := 0;
b2 := 0;
r := 200;
cycle := 0;
end;
begin
initgraphics;
set_variable_values;
repeat
outtextXY(50,20,‘Yellow line is Consumption Goal.’);
setcolor(lightblue);
outtextXY(135,195,’^’);
outtextXY(435,245,’^’);
setcolor(white);
outtextXY(50,430,‘Grey lines are consumer budgets.’);
outtextXY(50,420,‘Red traces are consumer expenditures.’);
setcolor(yellow);
outtextXY(50,440,‘Press spacebar to cycle program. Press Q/q to quit.’);
setcolor(white);
for i := count to count + 1280 do
begin
controller1; (* Run Consumption and Budget control loops *)
controller2;
controller3;
controller4;
controller5; (* Run Consumption and Budget control loops *)
program VD5; (* 11 August 2001 W.D. Williams UMKC *)
uses
dos, crt, graph, grutils;
var
qi, p,r,e,o, disturbance :real;
p2, r2, e2, o2 : real;
p3, e3, o3 : real;
e4, o4 : real;
e5, o5 : real;
gain, slow, damping, d :real;
gain2, slow2,
cycle, b, bes, be, bi, bg, cl, bl : real;
b2, bes2, be2, bi2, bg2, cl2, bl2 : real;
b3, bes3, be3, bi3, cl3, bl3 : real;
b4, bes4, be4, bi4, cl4, bl4 : real;
b5, bes5, be5, bi5, cl5, bl5 : real;
step, length, jump, jump2, jump3 , jump4, jump5 : real;
key : char;
i, c, rep, space, count : integer;
procedure controller1;
begin
e := r - o;
be := b - o;
if be > 0 then
begin
be := 0;
bi:= bi - bi/ ( damping ) ;
end
else
begin
bi := bi + be/( damping );
end;
cl := ( gain * e - o)/slow;
bl := ( bg * bi - o)/slow;
o := o + cl + bl;
end;
procedure controller2;
begin
e2 := r - o2;
be2 := b2 - o2;
if be2 > 0 then
begin
be2 := 0;
bi2 := bi2 - bi2/ damping ;
end
else
begin
bi2 := bi2 + be2/damping ;
end;
cl2 := ( gain * e2 - o2)/slow;
bl2 := ( bg * bi2 - o2)/slow;
o2 := o2 + cl2 + bl2;
end;
procedure controller3;
begin
e3 := r - o3;
be3 := b3 - o3;
if be3 > 0 then
begin
be3 := 0;
bi3 := bi3 - bi3/ damping ;
end
else
begin
bi3 := bi3 + be3/damping ;
end;
cl3 := ( gain * e3 - o3)/slow;
bl3 := ( bg * bi3 - o3)/slow;
o3 := o3 + cl3 + bl3;
end;
procedure controller4;
begin
e4 := r - o4;
be4 := b4 - o4;
if be4 > 0 then
begin
be4 := 0;
bi4 := bi4 - bi4/ damping ;
end
else
begin
bi4 := bi4 + be4/damping ;
end;
cl4 := ( gain * e4 - o4)/slow;
bl4 := ( bg * bi4 - o4)/slow;
o4 := o4 + cl4 + bl4;
end;
procedure controller5;
begin
e5 := r - o5;
be5 := b5 - o5;
if be5 > 0 then
begin
be5 := 0;
bi5 := bi5 - bi5/ damping ;
end
else
begin
bi5 := bi5 + be5/damping ;
end;
cl5 := ( gain * e5 - o5)/slow;
bl5 := ( bg * bi5 - o5)/slow;
o5 := o5 + cl5 + bl5;
end;
procedure display1;
begin
putpixel(round(i/2),vcenter - round(r), yellow);
putpixel(round(i/2),vcenter - round(o5 ), lightred );
putpixel(round(i/2),vcenter - round(b5 ), lightgray );
putpixel(round(i/2),vcenter - round(o4 ), lightred );
putpixel(round(i/2),vcenter - round(b4 ), lightgray );
putpixel(round(i/2),vcenter - round(o3 ), lightred );
putpixel(round(i/2),vcenter - round(b3 ), lightgray);
putpixel(round(i/2),vcenter - round(o2 ), lightred);
putpixel(round(i/2),vcenter - round(b2 ), lightgray);
putpixel(round(i/2),vcenter - round(o), lightred);
putpixel(round(i/2),vcenter - round(b), lightgray);
end;
procedure set_variable_values;
begin
disturbance := 0;
bg := 7; (* budget gain *)
gain := 10; (* consumption gain *)
bg2 := 7;
gain2 := 10;
be := 0;
be2 := 0;
slow := 60;
slow2 := 60;
damping := 80;
count := 1;
rep := 1;
step := 200;
length := 600;
bi := 100;
bi2 := 100 ;
jump := -50;
jump2 := -75;
jump3 := -100;
jump4 := -125;
jump5 := -150;
b := 0;
b2 := 0;
r := 200;
cycle := 0;
end;
begin
initgraphics;
set_variable_values;
repeat
outtextXY(50,20,‘Yellow line is Consumption Goal.’);
setcolor(lightblue);
outtextXY(135,195,’^’);
outtextXY(435,245,’^’);
setcolor(white);
outtextXY(50,430,‘Grey lines are consumer budgets.’);
outtextXY(50,420,‘Red traces are consumer expenditures.’);
setcolor(yellow);
outtextXY(50,440,‘Press spacebar to cycle program. Press Q/q to quit.’);
setcolor(white);
for i := count to count + 1280 do
begin
controller1; (* Consumption and Budget control loops *)
controller2;
controller3;
controller4;
controller5;
display1;
if i = step then b := b - jump;
if i = step then b2 := b2 - jump2;
if i = step then b3 := b3 - jump3;
if i = step then b4 := b4 - jump4;
if i = step then b5 := b5 - jump5;
if i = step + length then b := b + jump;
if i = step + length then b2 := b2 + jump2;
if i = step + length then b3 := b3 + jump3;
if i = step + length then b4 := b4 + jump4;
if i = step + length then b5 := b5 + jump5;
end;
if keypressed then key := readkey;
if ( key = 'c') or (key = 'C') then clearviewport;
if ( key = 'r') then r := r - 25;
if ( key = 'R') then r := r + 25;
if ( key = 'D') then damping := damping + damping * 0.25;
if ( key = 'd') then damping := damping - damping * 0.25;
if ( key = 'S') then slow := slow + slow * 0.25;
if ( key = 's') then slow := slow - slow * 0.25;
if ( key = 'j') then
begin
jump := jump - jump/4;
jump2 := jump2 - jump2/4;
jump3 := jump3 - jump3/4;
jump4 := jump4 - jump4/4;
jump5 := jump5 - jump5/4;
end;
if ( key = 'J') then
begin
jump := jump * 1.25;
jump2 := jump2 * 1.25;
jump3 := jump3 * 1.25;
jump4 := jump4 * 1.25;
jump5 := jump5 * 1.25;
end;
for i := count to count + 1280 do
begin
controller1;
controller2;
controller3;
controller4;
controller5;
if count > 1 then display1;
if i = step then b := b + jump;
if i = step then b2 := b2 + jump2;
if i = step then b3 := b3 + jump3;
if i = step then b4 := b4 + jump4;
if i = step then b5 := b5 + jump5;
if i = step + length then b := b - jump;
if i = step + length then b2 := b2 - jump2;
if i = step + length then b3 := b3 - jump3;
if i = step + length then b4 := b4 - jump4;
if i = step + length then b5 := b5 - jump5;
end;
if count > 1 then
begin
key := readkey;
clearviewport;
end;
inc(count);
until key ='q';
closegraph;
end. { of program }
end of message