'Vary the probability of selecting an attribute in Javascript
I am designing a conjoint experiment in Qualtrics with Javascript. I have created five attributes to be presented in the conjoint survey (name, profession, religion, age, partyid). I need the levels of some of these attributes to have different probabilities of being shown. For instance, the religion categories are Mainline Protestant, Evangelical Protestant, Catholic, Jewish, and none. To match the religious distribution of the general population, I need Jewish to have a lower likelihood of appearing the Evangelical Protestant.
The problem is I am totally new to Javascript and relying on borrowed code. This is where the levels for each attribute are randomly selected:
var profile = [];
profile.push(att0[Math.floor(Math.random()*att0.length)]);
profile.push(att1[Math.floor(Math.random()*att1.length)]);
profile.push(att2[Math.floor(Math.random()*att2.length)]);
profile.push(att3[Math.floor(Math.random()*att3.length)]);
profile.push(att4[Math.floor(Math.random()*att4.length)]);
return profile;
}
I just need help making some of the attributes (like religion) be chosen at specified probabilities for each level. You may also view a preview of what the survey looks like in Qualtrics. Preview of conjoint survey
Here is the entire chunk of code used for the conjoint design:
Qualtrics.SurveyEngine.addOnload(function()
{
// Admissible values for each dimension
var labels =
["Name",
"Occupation",
"Religion",
"Age",
"Party affiliation"];
var att0 = [
"name1",
"name2",
"name3",
"name4",
"name5",
"name6",
"name7",
"name8",
"name9",
"name10",
"name11",
"name12"];
var att1 = [
"Small business owner",
"Attorney",
"Teacher",
"CEO",
"Farmer"];
var att2 = [
"Mainline Protestant",
"Evangelical Protestant",
"Catholic",
"Jewish",
"None"];
var att3 = [
"30",
"45",
"60",
"75"];
var att4 = [
"Republican",
"Democrat",
"Independent"];
// function to draw a random set of 5 attributes
function drawtraits(att0,att1,att2,att3,att4)
{
var profile = [];
profile.push(att0[Math.floor(Math.random()*att0.length)]);
profile.push(att1[Math.floor(Math.random()*att1.length)]);
profile.push(att2[Math.floor(Math.random()*att2.length)]);
profile.push(att3[Math.floor(Math.random()*att3.length)]);
profile.push(att4[Math.floor(Math.random()*att4.length)]);
return profile;
}
function arraysSame( arrA, arrB ) {
// check if lengths are different
if(arrA.length !== arrB.length) return false;
for(var i=0;i<arrA.length;i++){
if(arrA[i]!==arrB[i]) return false;
}
return true;
}
// Scramble the order of rows in the table
var idx = ["0","1","2","3","4"];
var z = Math.floor(Math.random()*idx.length);
var idx0 = idx[z];
idx.splice(z,1);
var z = Math.floor(Math.random()*idx.length);
var idx1 = idx[z];
idx.splice(z,1);
var z = Math.floor(Math.random()*idx.length);
var idx2 = idx[z];
idx.splice(z,1);
var z = Math.floor(Math.random()*idx.length);
var idx3 = idx[z];
idx.splice(z,1);
var z = Math.floor(Math.random()*idx.length);
var idx4 = idx[z];
idx.splice(z,1);
Qualtrics.SurveyEngine.setEmbeddedData("r0",labels[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("r1",labels[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("r2",labels[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("r3",labels[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("r4",labels[idx4]);
/*
function shuffle(array) {
var m = array.length, t, i;
// While there remain elements to shuffle
while (m) {
// Pick a remaining element
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
*/
/****************************************
* DRAW ATTRIBUTES FOR CANDIDATES A AND B *
* If B=A, redraw B *
****************************************/
var a = drawtraits(att0,att1,att2,att3,att4);
var b = drawtraits(att0,att1,att2,att3,att4);
while (arraysSame(a,b))
{
var b = drawtraits(att0,att1,att2,att3,att4);
}
var ab = a.concat(b); // concatenate for convenient checking
var ba = b.concat(a); // reverse order for convenient checking
Qualtrics.SurveyEngine.setEmbeddedData("a0",a[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("a1",a[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("a2",a[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("a3",a[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("a4",a[idx4]);
Qualtrics.SurveyEngine.setEmbeddedData("b0",b[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("b1",b[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("b2",b[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("b3",b[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("b4",b[idx4]);
/*****************************************
* DRAW ATTRIBUTES FOR CANDIDATES C AND D *
* if (D=C) | (CD=AB) | (CD=BA), redraw D *
*****************************************/
var c = drawtraits(att0,att1,att2,att3,att4);
var d = drawtraits(att0,att1,att2,att3,att4);
var cd = c.concat(d); // concatenate for convenient checking
while (arraysSame(d,c) || arraysSame(cd,ab) || arraysSame(cd,ba) )
{
var d = drawtraits(att0,att1,att2,att3,att4);
var cd = c.concat(d); // rebuild
}
var dc = d.concat(c); // reverse order for convenient checking
Qualtrics.SurveyEngine.setEmbeddedData("c0",c[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("c1",c[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("c2",c[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("c3",c[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("c4",c[idx4]);
Qualtrics.SurveyEngine.setEmbeddedData("d0",d[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("d1",d[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("d2",d[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("d3",d[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("d4",d[idx4]);
/*****************************************
* DRAW ATTRIBUTES FOR CANDIDATES E AND F *
* if (F=E) | (EF=AB) | (EF=BA) | *
* (EF=CD) | (EF=DC), redraw F *
*****************************************/
var e = drawtraits(att0,att1,att2,att3,att4);
var f = drawtraits(att0,att1,att2,att3,att4);
var ef = e.concat(f); // concatenate for convenient checking
while (arraysSame(e,f) || arraysSame(ef,ab) || arraysSame(ef,ba) || arraysSame(ef,cd) || arraysSame(ef,dc) )
{
var f = drawtraits(att0,att1,att2,att3,att4);
var ef = e.concat(f);
}
var fe = f.concat(e); // reverse order for convenient checking
Qualtrics.SurveyEngine.setEmbeddedData("e0",e[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("e1",e[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("e2",e[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("e3",e[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("e4",e[idx4]);
Qualtrics.SurveyEngine.setEmbeddedData("f0",f[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("f1",f[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("f2",f[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("f3",f[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("f4",f[idx4]);
/*****************************************
* DRAW ATTRIBUTES FOR COUNTRIES G AND H *
* if (G=H) | (GH=AB) | (GH=BA) | *
* (GH=CD) | (GH=DC) | (GH=EF) *
* | (GH=FE), redraw H *
*****************************************/
var g = drawtraits(att0,att1,att2,att3,att4);
var h = drawtraits(att0,att1,att2,att3,att4);
var gh = g.concat(h); // concatenate for convenient checking
while (arraysSame(g,h) || arraysSame(gh,ab) || arraysSame(gh,ba) || arraysSame(gh,cd) || arraysSame(gh,dc) || arraysSame(gh,ef) || arraysSame(gh,fe))
{
var h = drawtraits(att0,att1,att2,att3,att4);
var gh = g.concat(h);
}
var hg = g.concat(h); // reverse order for convenient checking
Qualtrics.SurveyEngine.setEmbeddedData("g0",g[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("g1",g[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("g2",g[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("g3",g[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("g4",g[idx4]);
Qualtrics.SurveyEngine.setEmbeddedData("h0",h[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("h1",h[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("h2",h[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("h3",h[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("h4",h[idx4]);
/*****************************************
* DRAW ATTRIBUTES FOR CANDIDATES I AND J *
* if (F=E) | (EF=AB) | (EF=BA) | *
* (EF=CD) | (EF=DC), redraw F *
*****************************************/
var i = drawtraits(att0,att1,att2,att3,att4);
var j = drawtraits(att0,att1,att2,att3,att4);
var ij = i.concat(j); // concatenate for convenient checking
while (arraysSame(i,j) || arraysSame(ij,ab) || arraysSame(ij,ba) || arraysSame(ij,cd) || arraysSame(ij,dc) || arraysSame(ij,ef) || arraysSame(ij,fe) || arraysSame(ij,gh) || arraysSame(ij,hg))
{
var j = drawtraits(att0,att1,att2,att3,att4);
var ij = i.concat(j);
}
var ji = j.concat(i); // reverse order for convenient checking
Qualtrics.SurveyEngine.setEmbeddedData("i0",i[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("i1",i[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("i2",i[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("i3",i[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("i4",i[idx4]);
Qualtrics.SurveyEngine.setEmbeddedData("j0",j[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("j1",j[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("j2",j[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("j3",j[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("j4",j[idx4]);
/*****************************************
* DRAW ATTRIBUTES FOR CANDIDATES K AND L *
* if (F=E) | (EF=AB) | (EF=BA) | *
* (EF=CD) | (EF=DC), redraw F *
*****************************************/
var k = drawtraits(att0,att1,att2,att3,att4);
var l = drawtraits(att0,att1,att2,att3,att4);
var kl = k.concat(l); // concatenate for convenient checking
while (arraysSame(k,l) || arraysSame(kl,ab) || arraysSame(kl,ba) || arraysSame(kl,cd) || arraysSame(kl,dc) || arraysSame(kl,ef) || arraysSame(kl,fe) || arraysSame(kl,gh) || arraysSame(kl,hg) || arraysSame(kl,ij) || arraysSame(kn,ji))
{
var l = drawtraits(att0,att1,att2,att3,att4);
}
var lk = l.concat(k); // reverse order for convenient checking
Qualtrics.SurveyEngine.setEmbeddedData("k0",k[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("k1",k[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("k2",k[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("k3",k[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("k4",k[idx4]);
Qualtrics.SurveyEngine.setEmbeddedData("l0",l[idx0]);
Qualtrics.SurveyEngine.setEmbeddedData("l1",l[idx1]);
Qualtrics.SurveyEngine.setEmbeddedData("l2",l[idx2]);
Qualtrics.SurveyEngine.setEmbeddedData("l3",l[idx3]);
Qualtrics.SurveyEngine.setEmbeddedData("l4",l[idx4]);
});
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
