Archive for April, 2010

Academic Horror Story (UC Berkeley – 2)

Sunday, April 11th, 2010

Peter Duesberg, a professor at UC Berkeley, has been accused of misconduct for writing a paper espousing an unpopular idea (that HIV doesn’t cause AIDS) — and the university administration is taking this seriously! Here is the letter Duesberg received.

Peter Duesberg accused of misconduct

This is major-league harassment, similar to the human-subjects complaint against Michael Bailey. And it’s Berkeley’s second Academic Horror Story. Previously, Berkeley administrators carefully delayed an experimental subject from learning she had a big lump in her brain.

MoreYou can be as nasty as you like” (John Cleese on extremism, via Marginal Revolution).
.

The Man Who Would Be Queen

Saturday, April 10th, 2010

The Man Who Would Be Queen by Michael Bailey, about male homosexuality, is easily the best book about psychology ever written. It is emotional, persuasive, non-obvious, important, and well-written. Few books manage three of these adjectives. One sign of its emotion, persuasiveness, importance, and non-obviousness is the vilification Bailey underwent for writing it — led by people as smart as Deirdre McCloskey and Lynn Conway. Their campaign against it risked drawing more attention to it, of course. Now you can read it for free.

Can professors say the truth?. My correspondence with Deirdre McCloskey: part 1, part 2, part 3, part 4, part 5, part 6. Alice Dreger’s article about the controversy, including a short version of my correspondence with McCloskey.

Why Cory Doctorow Won’t Buy an iPad

Friday, April 9th, 2010

I loved this Boing Boing post by Cory Doctorow about why he won’t buy an iPad. One of his points:

Relying on incumbents to produce your revolutions is not a good strategy. They’re apt to take all the stuff that makes their products great and try to use technology to charge you extra for it, or prohibit it altogether.

Just as I believe that relying on the medical establishment to improve health care is not a good strategy. Those in power (incumbents) will resist change, especially revolutionary change. Science — connecting beliefs with reality — is surely the most revolutionary activity invented yet professional health researchers, simply because they have something to lose, now resist change.

One of Doctorow’s complaints:

Then there’s the device itself: clearly there’s a lot of thoughtfulness and smarts that went into the design. But there’s also a palpable contempt for the owner. I believe — really believe — in the stirring words of the Maker Manifesto: if you can’t open it, you don’t own it. Screws not glue.

Likewise, I believe it’s possible to do health research where everything is understandable. Where you can understand the data. Where you can understand the connection between the data and better health. The simple situations, treatments and measurements I use in my self-experimentation I judge to be an improvement over obscure health research, whereas I suspect most professional scientists instinctively think something must be wrong with it. Real science, they think, cannot be done by amateurs.

Grass-Fed vs. Grain-Fed Beef

Thursday, April 8th, 2010

A new review article compares them. Here is most important info, as far as I’m concerned:

A healthy diet should consist of roughly one to four times more omega-6 fatty acids than omega-3 fatty acids. The typical American diet tends to contain 11 to 30 times more omega -6 fatty acids than omega -3, a phenomenon that has been hypothesized as a significant factor in the rising rate of inflammatory disorders in the United States[40]. Table 2 shows significant differences in n-6:n-3 ratios between grass-fed and grain-fed beef, with and overall average of 1.53 and 7.65 for grass-fed and grain-fed, respectively, for all studies reported in this review.

Grass-fed really is better.

Arithmetic Test R Code (part 4)

Thursday, April 8th, 2010

>newmath2.trial
function (trial = 1, total.trials = 5, problem=newmath2.problems[1,],condition= “testing”, wait.range=c(1500,2500), num.possible=9, note = “”)
{#give one trial. returns list with components wait, answer.msec, etc.
#(“okay” or “aborted”) and results.
#
#              trial             trial number
#              total.trials      trials per session
#              problem           problem, answer (characters)
#              condition
#              wait.range        range of wait times (msec)
#              num.possible      number of possible wait times
#              note
#
tn=paste(“trial”,trial,”of”,total.trials)
msg=press.space.to.start(below=tn, col = “brown”)
if(msg==”end session”) return(“end session”)
wait.msec=newmath2.foreperiod(wait.range=wait.range, num.possible = num.possible)
t=newmath2.problem(problem=problem)
newmath2.feedback(problem=problem[1],answer.msec=t$answer.msec,correct=t$correct,status=t$status)
list(wait.msec=wait.msec, answer.msec=t$answer.msec,actual.answer=t$actual.answer, correct=t$correct,include=t$include,status=t$status)
}

> press.space.to.start
function (msg = “press space”, prompt = “to start”, below=”", beepf=FALSE, bottom =”press letter to end session”, col = “red”, text.size=5)
{#wait for Enter to start data collection with getGraphicsEvent
#
#              beepf     beep after input?
#
paint(center=prompt, above = msg, below=below, bottom = bottom, text.size=text.size, col = col)
msg=”get answer”
while(msg==”get answer”) {
t=getGraphicsEvent(prompt=”",onKeybd=get.key)
if(beepf) beep()
if (t==” “) msg=”okay”
if (t %in% strsplit(alphabet,split=”")[[1]]){
msg = “end session”
paint(“ending session”)
}
}
msg
}
> newmath2.foreperiod
function (wait.range=c(1000,2000), num.possible = 9)
{#delay for interval randomly selected within given range. Returns
#wait in msec
#
#          wait.range      lower and upper possible delays (msec)
#          num.possible    number of possible waits (which are equally spaced)
#
#
possible.waits=seq(from = wait.range[1],to = wait.range[2], length.out = num.possible)
wait.msec=sample(possible.waits,1)
paint(“|”,duration = wait.msec/1000)
wait.msec
}
> newmath2.problem
function (problem = c(“3+4″,”7″),status = “okay”)
{#show new arithmetic problem. Returns list of latency,
#answer, right/wrong, and note.
#
#                     problem   vector of problem and answer (both characters)
#                     status    status
#
newmath2.show(problem[1])
see.time = Sys.time()
actual.answer=getGraphicsEvent(prompt=”",onKeybd = get.key)
resp.time< <-Sys.time()
answer.msec=as.integer(1000*difftime(resp.time,see.time,unit="sec"))
if(!actual.answer %in% as.character(c(0:9))){
actual.answer=""
answer.msec=NA
correct=NA
include=FALSE
if (an=="q") status = "abort session" else status="abort trial"
}
else {
correct=actual.answer==problem[2]
include=TRUE
status="okay"
}
list(answer.msec=answer.msec,actual.answer=actual.answer,correct=correct, include=include, status = status)
}
> newmath2.feedback
function (trial = 5, problem = “3+4″, actual.answer=7, status= “”, answer.msec = 639, correct = TRUE, number.back=15)
{#give feedback on trial
#
#            trial         trial number
#            problem       problem shown
#            actual.answer actual answer (numeric)
#            correct       correct?
#            status        anything unusual?
#            answer.msec   latency of answer (msec)
#            number.back   compare this rt with how many back?
#
if(status==”abort block”){
paint(“block aborted”,duration = 1.5)
return()
}
if(status==”abort session”){
paint(“session aborted”,duration = 1.5)
return()
}
if(!correct){
paint(“wrong”,duration = 1.5)
return()
}
previous.answer.msec=newmath2$answer.msec[(problem==newmath2$problem)&newmath2$correct&newmath2$include]
ptile=newmath2.ptile(answer.msec,previous.answer.msec)
ptile.msg=paste(round(ptile),”%ile”,sep=”")
whole.msg=paste(answer.msec,”ms”,ptile.msg)
paint(whole.msg, text.size = 4, col = “blue”, duration = 1)
}

> paint
function (center=”",above=”",below=”", bottom = “”, x = 0, y = 0,xlim = c(-1,1),ylim = c(-1,1),text.size=4, small.size = 2, duration = 1, col=”red”, new = TRUE)
{# write text on graph, clearing previous
#
#                center         text for middle of graph
#                above          text above that
#                below          text below that
#                bottom         small text at bottom
#                x              x location of text
#                y              y location
#                xlim
#                ylim
#                text.size      cex value
#                small.size     cex value for small text
#                duration       wait (sec) before continuing
#                col            color
#                new            erase what was there?
#
if (new) plot(0,0,xlab=”",ylab=”",xaxt=”n”,yaxt=”n”,type=”n”, xlim=xlim, ylim = ylim)
text(center,x=x,y=y, cex = text.size, col = col)
text(above,x=x,y=y+.3, cex = text.size, col = col)
text(below,x=x,y=y-.3, cex = text.size, col = col)
text(bottom,x=x,y=y-.85, cex = small.size, col = col)
Sys.sleep(duration)
}