{"id":7488,"date":"2026-07-19T23:58:31","date_gmt":"2026-07-19T23:58:31","guid":{"rendered":"https:\/\/h-in-q.com\/quota-simulator\/"},"modified":"2026-07-20T15:46:22","modified_gmt":"2026-07-20T15:46:22","slug":"simulador-de-cuotas","status":"publish","type":"page","link":"https:\/\/h-in-q.com\/es\/quota-simulator\/","title":{"rendered":"Sample Structure &#038; Quotas Simulator"},"content":{"rendered":"<style>\n.hinq-qs-wrap{position:fixed;top:var(--wp-admin--admin-bar--height,0px);left:0;width:100%;height:calc(100% - var(--wp-admin--admin-bar--height,0px));z-index:9999;overflow:hidden;background:#f2f6fa}\n.hinq-qs-wrap *{box-sizing:border-box;margin:0;padding:0}\n.hinq-qs-wrap{--blue:#1b75bc;--blue-deep:#135a92;--blue-light:#29abe2;--blue-pale:#e9f4fb;--blue-mist:#f3f9fd;--orange:#f28c1e;--orange-pale:#fef3e4;--ink:#22405c;--ink-dim:#5d7690;--ink-faint:#8fa3b8;--bg:#f2f6fa;--panel:#ffffff;--line:#d8e3ee;--line-soft:#e7eef5;--mono:\"IBM Plex Mono\",\"SFMono-Regular\",ui-monospace,Menlo,Consolas,monospace;--sans:\"Archivo\",\"Inter\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif}\n.hinq-qs-wrap{display:flex;flex-direction:column;font:13.5px\/1.4 var(--sans);-webkit-font-smoothing:antialiased;color:var(--ink)}\n.qs-header{flex:0 0 auto;display:flex;align-items:center;gap:12px;padding:8px 18px;background:var(--panel);border-bottom:2px solid var(--blue)}\n.qs-logo{flex:0 0 auto;display:flex;align-items:center}\n.qs-header h1{font-size:15px;font-weight:800;letter-spacing:.02em;text-transform:uppercase;color:var(--blue-deep)}\n.qs-header h1 b{color:var(--orange)}\n.qs-header .sub{color:var(--ink-dim);font-size:12px;margin-left:auto}\n.qs-app{flex:1 1 auto;min-height:0;display:grid;grid-template-columns:322px 292px 1fr;gap:12px;padding:12px 16px;overflow:hidden}\n.qs-zone{min-height:0;display:flex;flex-direction:column;gap:10px;overflow-y:auto}\n.qs-zone::-webkit-scrollbar{width:8px}\n.qs-zone::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}\n.qs-panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 1px 2px rgba(27,117,188,.05)}\n.qs-panel .hd{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid var(--line-soft);font-size:10.5px;font-weight:800;letter-spacing:.13em;text-transform:uppercase;color:var(--blue)}\n.qs-panel .hd .znum{background:var(--blue);color:#fff;border-radius:5px;font:800 10px\/1 var(--mono);padding:4px 6px}\n.qs-panel .hd::after{content:\"\";width:6px;height:6px;border-radius:2px;background:var(--orange);margin-left:auto;opacity:.9}\n.qs-panel .bd{padding:10px 12px}\n.qs-field{margin-bottom:10px}\n.qs-field label{display:block;font-size:10.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-dim);margin-bottom:4px}\n.qs-wrap select,.qs-wrap input[type=text],.qs-wrap input[type=number]{width:100%;background:var(--blue-mist);border:1px solid var(--line);color:var(--ink);border-radius:6px;padding:6px 8px;font:13px var(--sans);outline:none;transition:border-color .15s}\n.qs-wrap input[type=number]{font-family:var(--mono);font-size:12px}\n.qs-wrap select:focus,.qs-wrap input:focus{border-color:var(--blue-light);background:#fff}\n.qs-row2{display:grid;grid-template-columns:1fr 1fr;gap:8px}\n.qs-methodnote{border:1px solid var(--line);border-left:3px solid var(--blue-light);border-radius:6px;background:var(--blue-mist);padding:7px 10px;font-size:11.5px;color:var(--ink-dim);margin-bottom:10px}\n.qs-varblock{border:1px solid var(--line);border-radius:8px;background:var(--blue-mist);padding:8px;margin-bottom:8px}\n.qs-varblock .vtop{display:grid;grid-template-columns:1fr 84px;gap:6px;margin-bottom:6px}\n.qs-classrow{display:grid;grid-template-columns:1fr 68px;gap:6px;margin-bottom:5px}\n.qs-classrow input{background:#fff}\n.qs-classrow input[type=number]{text-align:right}\n.qs-wsum{display:flex;justify-content:space-between;font-family:var(--mono);font-size:11px;color:var(--ink-faint);margin-top:2px}\n.qs-wsum .val.off{color:var(--orange);font-weight:700}\n.qs-wsum .val.on{color:var(--blue-light);font-weight:700}\nbutton.qs-cta{width:100%;border:none;border-radius:8px;cursor:pointer;background:var(--blue);color:#fff;font:800 12.5px var(--sans);letter-spacing:.06em;text-transform:uppercase;padding:11px;box-shadow:inset 0 -3px 0 var(--orange);transition:background .15s,transform .05s}\nbutton.qs-cta:hover{background:var(--blue-deep)}\nbutton.qs-cta:active{transform:translateY(1px)}\n.qs-hint{font-size:11.5px;color:var(--ink-faint);margin-top:7px}\n.qs-kpi{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:7px 12px;border-bottom:1px solid var(--line-soft)}\n.qs-kpi:last-child{border-bottom:none}\n.qs-kpi .k{font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-dim)}\n.qs-kpi .v{font:700 16px var(--mono);color:var(--blue-deep);white-space:nowrap}\n.qs-kpi.acc .v{color:var(--blue-light)}\n.qs-kpi.acc{box-shadow:inset 3px 0 0 var(--orange)}\n.qs-banner{display:none;gap:8px;align-items:flex-start;border:1px solid var(--orange);background:var(--orange-pale);border-radius:10px;padding:9px 12px;font-size:12px;color:#8a5210}\n.qs-banner.show{display:flex}\n.qs-compare .barrow{padding:7px 12px;border-bottom:1px solid var(--line-soft)}\n.qs-compare .barrow:last-child{border-bottom:none}\n.qs-compare .top{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:4px}\n.qs-compare .lbl{font-size:12px;font-weight:700;color:var(--ink)}\n.qs-compare .lbl small{display:block;color:var(--ink-faint);font-weight:400;font-size:10.5px}\n.qs-compare .n{font:800 13px var(--mono);color:var(--blue-deep);white-space:nowrap}\n.qs-compare .track{height:10px;background:var(--blue-pale);border-radius:5px;overflow:hidden}\n.qs-compare .fill{height:100%;border-radius:5px;background:linear-gradient(90deg,var(--blue),var(--blue-light));transition:width .35s ease}\n.qs-emptycard{border:1.5px dashed var(--line);border-radius:10px;color:var(--ink-faint);display:flex;align-items:center;justify-content:center;flex:1;font-size:12.5px;text-align:center;padding:18px;background:rgba(255,255,255,.5)}\n.qs-out{display:flex;flex-direction:column;min-height:0}\n.qs-outwrap{display:none;flex-direction:column;min-height:0;flex:1}\n.qs-outwrap.live{display:flex}\n.qs-tabs{display:flex;gap:5px;flex:0 0 auto}\n.qs-tab{border:1px solid var(--line);border-bottom:none;background:var(--blue-mist);color:var(--ink-dim);border-radius:8px 8px 0 0;padding:7px 12px;cursor:pointer;font:700 11.5px var(--sans);letter-spacing:.02em}\n.qs-tab.on{background:var(--panel);color:var(--blue-deep);border-color:var(--blue);border-bottom:1px solid var(--panel);margin-bottom:-1px;position:relative;z-index:1;box-shadow:inset 0 3px 0 var(--orange)}\n.qs-tabwrap{border:1px solid var(--line);border-radius:0 10px 10px 10px;background:var(--panel);flex:1;min-height:0;display:flex;flex-direction:column}\n.qs-tabwrap.noround{border-radius:10px}\n.qs-pane{display:flex;flex-direction:column;min-height:0;flex:1}\n.qs-scennote{flex:0 0 auto;padding:8px 12px;border-bottom:1px solid var(--line-soft);font-size:12px;color:var(--ink-dim)}\n.qs-scennote b{color:var(--ink)}\n.qs-scennote .tag{display:inline-block;font:800 10px var(--mono);letter-spacing:.08em;background:var(--blue);color:#fff;border-radius:4px;padding:2px 6px;margin-right:7px}\n.qs-pill-ok{color:var(--blue-light);font-weight:700;font-size:11px}\n.qs-mandatory{color:var(--orange);font-weight:800}\n.qs-twrap{flex:1;min-height:0;overflow:auto}\n.qs-wrap table{border-collapse:collapse;width:100%;font-size:12px}\n.qs-wrap thead th{position:sticky;top:0;background:var(--blue-pale);z-index:2;text-align:right;padding:7px 11px;font-size:10px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--blue-deep);border-bottom:1px solid var(--line);white-space:nowrap}\n.qs-wrap thead th:first-child,.qs-wrap tbody td:first-child{text-align:left}\n.qs-wrap tbody td{padding:5px 11px;border-bottom:1px solid var(--line-soft);font-family:var(--mono);font-size:11.5px;text-align:right;white-space:nowrap}\n.qs-wrap tbody td:first-child{font-family:var(--sans);font-weight:600;font-size:12px}\n.qs-wrap tbody tr:nth-child(even) td{background:var(--blue-mist)}\n.qs-wrap tbody tr:hover td{background:var(--blue-pale)}\n.qs-wrap tbody td.varhead{font-family:var(--sans);font-weight:800;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--blue);background:var(--blue-pale)!important;text-align:left}\n.qs-wrap tfoot td{padding:7px 11px;font:800 12px var(--mono);text-align:right;border-top:2px solid var(--blue);color:var(--blue-deep);background:var(--blue-pale);position:sticky;bottom:0}\n.qs-wrap tfoot td:first-child{text-align:left;font-family:var(--sans)}\n.qs-wrap td .w-extreme{color:var(--orange);font-weight:800}\n.qs-wrap td input.merr,.qs-wrap td input.ncell{width:70px;text-align:right;padding:3px 6px;background:#fff;border:1px solid var(--line);border-radius:5px;color:var(--ink);font:11.5px var(--mono)}\n.qs-guardrail{flex:0 0 auto;margin:8px 12px 10px;border:1px solid var(--line);border-left:3px solid var(--orange);border-radius:6px;padding:8px 11px;font-size:11.5px;color:var(--ink-dim);background:var(--blue-mist)}\n<\/style>\n<div class=\"hinq-qs-wrap qs-wrap\">\n<div class=\"qs-header\">\n  <span class=\"qs-logo\" aria-hidden=\"true\"><svg width=\"34\" height=\"34\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"80\" height=\"80\" rx=\"12\" fill=\"#1b75bc\"\/><text x=\"50%\" y=\"54%\" dominant-baseline=\"middle\" text-anchor=\"middle\" font-family=\"Arial\" font-weight=\"900\" font-size=\"42\" fill=\"white\">H<\/text><\/svg><\/span><\/p>\n<h1>H-in-Q <b>&middot;<\/b> Sample Structure &amp; Quotas Simulator<\/h1>\n<p>  <span class=\"sub\">Precision &middot; Feasibility &middot; Budget &mdash; see the trade-offs before fieldwork starts.<\/span>\n<\/div>\n<div class=\"qs-app\">\n<section class=\"qs-zone\" id=\"qsZoneIn\">\n<div class=\"qs-panel\">\n<div class=\"hd\"><span class=\"znum\">1<\/span><span>Input &middot; Configuration<\/span><\/div>\n<div class=\"bd\">\n<div class=\"qs-field\">\n          <label for=\"qsMethod\">Quota method<\/label><br \/>\n          <select id=\"qsMethod\"><option value=\"cross\" selected>Cross quotas (interlocked cells)<\/option><option value=\"simple\">Simple quotas (marginal, up to 5 vars)<\/option><\/select>\n        <\/div>\n<div class=\"qs-field\">\n          <label for=\"qsPrecision\">Precision target<\/label><br \/>\n          <select id=\"qsPrecision\"><option value=\"cell\" selected>Per sub-target (each cell \/ class readable)<\/option><option value=\"global\">Global sample only (total-level reading)<\/option><\/select>\n        <\/div>\n<div class=\"qs-methodnote\" id=\"qsMethodNote\"><\/div>\n<div class=\"qs-row2\">\n<div class=\"qs-field\">\n            <label for=\"qsNVars\">Quota variables<\/label><br \/>\n            <select id=\"qsNVars\"><\/select>\n          <\/div>\n<div class=\"qs-field\">\n            <label for=\"qsGErr\">Margin of error %<\/label><br \/>\n            <input type=\"number\" id=\"qsGErr\" value=\"5\" min=\"0.5\" max=\"20\" step=\"0.5\">\n          <\/div>\n<\/p><\/div>\n<div id=\"qsVarsHost\"><\/div>\n<p>        <button class=\"qs-cta\" id=\"qsGoBtn\">Generate plan &amp; scenarios<\/button><\/p>\n<p class=\"qs-hint\">Weights are auto-normalized to 100% per variable.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/section>\n<section class=\"qs-zone\" id=\"qsZoneRecap\">\n<div class=\"qs-emptycard\" id=\"qsEmptyRecap\">The recap &mdash; key figures and scenario totals &mdash; appears here after generation.<\/div>\n<div id=\"qsRecapWrap\" style=\"display:none;flex-direction:column;gap:10px\">\n<div class=\"qs-panel\">\n<div class=\"hd\"><span class=\"znum\">2<\/span><span>Recap &middot; Key figures<\/span><\/div>\n<div id=\"qsKpis\"><\/div>\n<\/p><\/div>\n<div class=\"qs-banner\" id=\"qsGranBanner\">\n        <span aria-hidden=\"true\">&#9888;<\/span><br \/>\n        <span><b>Sample fragmentation risk:<\/b> <b id=\"qsGranCount\"><\/b> cross-quota cells (more than 8). Consider dropping a variable, merging classes &mdash; or switching to <b>simple quotas<\/b>.<\/span>\n      <\/div>\n<div class=\"qs-panel qs-compare\">\n<div class=\"hd\"><span id=\"qsCompareTitle\">Total interviews per scenario<\/span><\/div>\n<div id=\"qsCompareHost\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/section>\n<section class=\"qs-zone qs-out\" id=\"qsZoneOut\">\n<div class=\"qs-emptycard\" id=\"qsEmptyOut\">Define your quota plan in zone 1, then click <b>&nbsp;Generate plan &amp; scenarios&nbsp;<\/b> to open the detailed tables.<\/div>\n<div class=\"qs-outwrap\" id=\"qsOutWrap\">\n<div class=\"qs-tabs\" role=\"tablist\" id=\"qsTabsBar\">\n        <button class=\"qs-tab on\" data-t=\"s1\" role=\"tab\" aria-selected=\"true\">S1 &middot; Proportional<\/button><br \/>\n        <button class=\"qs-tab\" data-t=\"s2\" role=\"tab\" aria-selected=\"false\">S2 &middot; Equal cells<\/button><br \/>\n        <button class=\"qs-tab\" data-t=\"s3\" role=\"tab\" aria-selected=\"false\">S3 &middot; Custom plan<\/button>\n      <\/div>\n<div class=\"qs-tabwrap\" id=\"qsTabWrap\">\n<div id=\"qsPane-s1\" class=\"qs-pane\"><\/div>\n<div id=\"qsPane-s2\" class=\"qs-pane\" style=\"display:none\"><\/div>\n<div id=\"qsPane-s3\" class=\"qs-pane\" style=\"display:none\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/section>\n<\/div>\n<\/div>\n<p><script>\nsetTimeout(function(){\n(function(){\n\"use strict\";\nconst $=(s,r=document)=>r.querySelector(s);\nconst $$=(s,r=document)=>[...r.querySelectorAll(s)];\nconst fmt=n=>Math.round(n).toLocaleString(\"en-US\");\nconst pct=(n,d=1)=>(n*100).toFixed(d)+\"%\";\nconst Z95=1.96;\nfunction sampleSize(E){return Math.ceil((Z95*Z95*0.25)\/(E*E));}\nfunction marginOf(n){return n>0?Z95*Math.sqrt(0.25\/n)*100:NaN;}\nfunction effectiveN(rows){const sw=rows.reduce((a,r)=>a+r.n*r.weight,0);const sw2=rows.reduce((a,r)=>a+r.n*r.weight*r.weight,0);return sw2>0?(sw*sw)\/sw2:0;}\nconst DEFS=[{name:\"Gender\",classes:[[\"Male\",49],[\"Female\",51]]},{name:\"Age\",classes:[[\"18-34\",35],[\"35-54\",34],[\"55+\",31]]},{name:\"Region\",classes:[[\"North\",50],[\"South\",50]]},{name:\"CSP\",classes:[[\"CSP+\",40],[\"CSP-\",60]]},{name:\"Habitat\",classes:[[\"Urban\",65],[\"Rural\",35]]}];\nfunction isSimple(){return $(\"#qsMethod\").value===\"simple\";}\nfunction isGlobal(){return $(\"#qsPrecision\").value===\"global\";}\nfunction refreshMethodNote(){$(\"#qsMethodNote\").innerHTML=isSimple()?\"<b>Simple (marginal) quotas:<\/b> each variable is controlled independently \u2014 far easier fieldwork, up to 5 variables. Crossings are left free.\":\"<b>Cross quotas:<\/b> every combination (cell) is controlled \u2014 the base structure is guaranteed, but each extra variable multiplies the number of cells.\";}\nfunction refreshVarOptions(){const max=isSimple()?5:3;const sel=$(\"#qsNVars\");const cur=Math.min(+sel.value||2,max);sel.innerHTML=Array.from({length:max},(_,i)=>\"<option value=\\\"\" + (i+1) + \"\\\" \" + (i+1===cur?\"selected\":\"\") + \">\" + (i+1) + \" variable\" + (i?\"s\":\"\") + \"<\/option>\").join(\"\");}\nfunction buildVarBlocks(){const n=+$(\"#qsNVars\").value;const host=$(\"#qsVarsHost\");host.innerHTML=\"\";for(let v=0;v<n;v++){const def=DEFS[v];const blk=document.createElement(\"div\");blk.className=\"qs-varblock\";blk.dataset.v=v;blk.innerHTML=\"\n\n<div class='vtop'>\n<div><label>Variable \"+(v+1)+\" name<\/label><input type='text' class='vname' value='\"+def.name+\"' maxlength='24'><\/div>\n<div><label>Classes<\/label><select class='vcnt'>\"+ [2,3,4,5,6].map(k=>\"<option value='\"+k+\"' \"+(k===def.classes.length?\"selected\":\"\")+\">\" +k+\"<\/option>\").join(\"\")+\"<\/select><\/div>\n<\/div>\n<div class='qs-classrow-host'><\/div>\n<div class='qs-wsum'><span>\u03a3 weights<\/span><span class='val'>\u2014<\/span><\/div>\n<p>\";host.appendChild(blk);buildClassRows(blk);blk.querySelector(\".vcnt\").addEventListener(\"change\",()=>buildClassRows(blk));blk.addEventListener(\"input\",e=>{if(e.target.classList.contains(\"cw\"))refreshSum(blk);});}}\nfunction buildClassRows(blk){const v=+blk.dataset.v,k=+blk.querySelector(\".vcnt\").value;const host=blk.querySelector(\".qs-classrow-host\");const def=DEFS[v].classes;host.innerHTML=\"\";const even=+(100\/k).toFixed(1);for(let i=0;i<k;i++){const nm=def[i]?def[i][0]:\"Class \"+(i+1);const wt=def[i]&#038;&#038;def.length===k?def[i][1]:even;const row=document.createElement(\"div\");row.className=\"qs-classrow\";row.innerHTML=\"<input type='text' class='cn' value='\"+nm+\"' maxlength='20'><input type='number' class='cw' value='\"+wt+\"' min='0.1' max='100' step='0.1'>\";host.appendChild(row);}refreshSum(blk);}\nfunction refreshSum(blk){const s=$$(\".cw\",blk).reduce((a,i)=>a+(+i.value||0),0);const el=blk.querySelector(\".qs-wsum .val\");el.textContent=s.toFixed(1)+\"%\";el.className=\"val \"+(Math.abs(s-100)<.05?\"on\":\"off\");}let MODEL=null;\nfunction readConfig(){const gE=Math.min(20,Math.max(0.5,+$(\"#qsGErr\").value||5))\/100;const vars=$$(\".qs-varblock\").map(blk=>{const name=blk.querySelector(\".vname\").value.trim()||\"Variable\";const rows=$$(\".qs-classrow\",blk).map(r=>({name:r.querySelector(\".cn\").value.trim()||\"Class\",w:Math.max(0.0001,+r.querySelector(\".cw\").value||0)}));const sum=rows.reduce((a,r)=>a+r.w,0);rows.forEach(r=>r.w=r.w\/sum);return{name,rows};});return{gE,vars,simple:isSimple(),global:isGlobal()};}\nfunction cartesian(vars){let cells=[{label:[],share:1}];for(const v of vars){const next=[];for(const c of cells)for(const r of v.rows)next.push({label:[...c.label,r.name],share:c.share*r.w});cells=next;}return cells.map((c,i)=>({id:i,label:c.label.join(\" \u00b7 \"),share:c.share}));}\nfunction computeModel(){const cfg=readConfig();const baseN=sampleSize(cfg.gE);const M={...cfg,baseN};if(cfg.simple){const minShare=Math.min(...cfg.vars.flatMap(v=>v.rows.map(r=>r.w)));M.minShare=minShare;M.total=cfg.global?baseN:Math.ceil(baseN\/minShare);M.plan=cfg.vars.map(v=>({name:v.name,rows:v.rows.map(r=>({name:r.name,share:r.w,n:Math.round(M.total*r.w)}))}))}else{const cells=cartesian(cfg.vars);M.cells=cells;const minShare=Math.min(...cells.map(c=>c.share));M.minShare=minShare;if(cfg.global){const t1=baseN;M.s1=cells.map(c=>({...c,n:Math.round(t1*c.share)}));M.s1Total=M.s1.reduce((a,c)=>a+c.n,0);const nEq=Math.ceil(baseN\/cells.length);M.s2Total=nEq*cells.length;M.s2=cells.map(c=>{const sS=nEq\/M.s2Total;return{...c,n:nEq,sS,weight:c.share\/sS};});M.s2EffN=effectiveN(M.s2);}else{const t1=Math.ceil(baseN\/minShare);M.s1=cells.map(c=>({...c,n:Math.round(t1*c.share)}));M.s1Total=M.s1.reduce((a,c)=>a+c.n,0);M.s2Total=baseN*cells.length;M.s2=cells.map(c=>{const sS=baseN\/M.s2Total;return{...c,n:baseN,sS,weight:c.share\/sS};});M.s2EffN=effectiveN(M.s2);}}MODEL=M;}\nfunction kpiRow(k,v,acc){return \"<\/p>\n<div class='qs-kpi\"+(acc?\" acc\":\"\")+\"'><span class='k'>\"+k+\"<\/span><span class='v'>\"+v+\"<\/span><\/div>\n<p>\";}\nfunction renderKPIs(){const m=MODEL;let html=\"\";if(m.simple){const nCls=m.vars.reduce((a,v)=>a+v.rows.length,0);html=kpiRow(\"Method\",\"Simple \u00b7 \"+(m.global?\"Global\":\"Per class\"))+kpiRow(\"Variables \u00b7 classes\",m.vars.length+\" \u00b7 \"+nCls)+kpiRow(\"Smallest class\",pct(m.minShare))+kpiRow(\"Total sample N\",fmt(m.total),true);}else{html=kpiRow(\"Method\",\"Cross \u00b7 \"+(m.global?\"Global\":\"Per cell\"))+kpiRow(\"Cross-quota cells\",m.cells.length)+kpiRow(\"Smallest cell\",pct(m.minShare))+kpiRow(m.global?\"Required total N\":\"Min. n per cell\",fmt(m.baseN),true);}$(\"#qsKpis\").innerHTML=html;}\nfunction renderBanner(){const show=!MODEL.simple&&MODEL.cells.length>8;$(\"#qsGranBanner\").classList.toggle(\"show\",show);if(!MODEL.simple)$(\"#qsGranCount\").textContent=MODEL.cells.length;}\nfunction renderCompare(s3Total){const host=$(\"#qsCompareHost\");if(MODEL.simple){$(\"#qsCompareTitle\").textContent=\"Total interviews \u2014 simple quota plan\";host.innerHTML=\"<\/p>\n<div class='barrow'>\n<div class='top'><span class='lbl'>Simple quotas<small>\"+(MODEL.global?\"global precision\":\"every class readable\")+\" \u2014 no weighting<\/small><\/span><span class='n'>N = \"+fmt(MODEL.total)+\"<\/span><\/div>\n<div class='track'>\n<div class='fill' style='width:100%'><\/div>\n<\/div>\n<\/div>\n<p>\";return;}$(\"#qsCompareTitle\").textContent=\"Total interviews per scenario\";const m=MODEL;const rows=[[\"Scenario 1\",\"Proportional \u2014 no weighting\",m.s1Total],[\"Scenario 2\",\"Equal cells \u2014 weighting mandatory\",m.s2Total],[\"Scenario 3\",\"Custom plan\",s3Total!=null?s3Total:m.s2Total]];const max=Math.max(...rows.map(r=>r[2]));host.innerHTML=rows.map(function(r){return \"<\/p>\n<div class='barrow'>\n<div class='top'><span class='lbl'>\"+r[0]+\"<small>\"+r[1]+\"<\/small><\/span><span class='n'>N = \"+fmt(r[2])+\"<\/span><\/div>\n<div class='track'>\n<div class='fill' style='width:\"+Math.max(3,r[2]\/max*100)+\"%'><\/div>\n<\/div>\n<\/div>\n<p>\";}).join(\"\");}function tableShell(h,b,f,note,extra){return note+\"<\/p>\n<div class='qs-twrap'>\n<table>\n<thead>\n<tr>\"+h+\"<\/tr>\n<\/thead>\n<tbody>\"+b+\"<\/tbody>\n<tfoot>\n<tr>\"+f+\"<\/tr>\n<\/tfoot>\n<\/table>\n<\/div>\n<p>\"+(extra||\"\");}\nfunction renderSimplePlan(){const m=MODEL;const note=\"<\/p>\n<div class='qs-scennote'><span class='tag'>PLAN<\/span><b>Simple (marginal) quotas \u2014 \"+(m.global?\"global precision\":\"every class readable\")+\".<\/b> Each variable is filled proportionally and independently. <span class='qs-pill-ok'>Weighting: not required \u2713<\/span><\/div>\n<p>\";const head=\"<\/p>\n<th>Variable \u00b7 class<\/th>\n<th>Pop. %<\/th>\n<th>Interviews (n)<\/th>\n<th>Class error<\/th>\n<p>\";const body=m.plan.map(v=>\"<\/p>\n<tr>\n<td class='varhead' colspan='4'>\"+v.name+\"<\/td>\n<\/tr>\n<p>\"+v.rows.map(r=>\"<\/p>\n<tr>\n<td>\"+r.name+\"<\/td>\n<td>\"+pct(r.share)+\"<\/td>\n<td>\"+fmt(r.n)+\"<\/td>\n<td>\u00b1\"+marginOf(r.n).toFixed(1)+\"%<\/td>\n<\/tr>\n<p>\").join(\"\")).join(\"\");const foot=\"<\/p>\n<td>TOTAL SAMPLE<\/td>\n<td>100.0%<\/td>\n<td>N = \"+fmt(m.total)+\"<\/td>\n<td>\u00b1\"+marginOf(m.total).toFixed(1)+\"% global<\/td>\n<p>\";$(\"#qsPane-s1\").innerHTML=tableShell(head,body,foot,note);}\nfunction renderS1(){const m=MODEL;const gErr=marginOf(m.s1Total).toFixed(1);const smallest=m.global?\"N set at total level; cells fill proportionally.\":\"the smallest cell (\"+pct(m.minShare)+\") must reach n = \"+fmt(m.baseN)+\", inflating the whole sample.\";const note=\"<\/p>\n<div class='qs-scennote'><span class='tag'>S1<\/span><b>Global representativeness.<\/b> Strictly mirrors the population \u2014 \"+smallest+\" <span class='qs-pill-ok'>Weighting: not required \u2713<\/span><\/div>\n<p>\";const head=\"<\/p>\n<th>Cross-quota cell<\/th>\n<th>Pop. %<\/th>\n<th>Interviews (n)<\/th>\n<th>Cell error<\/th>\n<p>\";const body=m.s1.map(c=>\"<\/p>\n<tr>\n<td>\"+c.label+\"<\/td>\n<td>\"+pct(c.share)+\"<\/td>\n<td>\"+fmt(c.n)+\"<\/td>\n<td>\u00b1\"+marginOf(c.n).toFixed(1)+\"%<\/td>\n<\/tr>\n<p>\").join(\"\");const foot=\"<\/p>\n<td>TOTAL SAMPLE<\/td>\n<td>100.0%<\/td>\n<td>N = \"+fmt(m.s1Total)+\"<\/td>\n<td>\u00b1\"+gErr+\"% global<\/td>\n<p>\";$(\"#qsPane-s1\").innerHTML=tableShell(head,body,foot,note);}\nfunction renderS2(){const m=MODEL;const effN=m.s2EffN;const gEff=marginOf(effN).toFixed(1);const note=\"<\/p>\n<div class='qs-scennote'><span class='tag'>S2<\/span><b>Cross-target analysis\"+(m.global?\"\":\" &amp; equal precision\")+\".<\/b> Same n in every cell. <span class='qs-mandatory'>Weighting mandatory<\/span> \u2014 effective N = \"+fmt(effN)+\", global error \u00b1\"+gEff+\"%.<\/div>\n<p>\";const head=\"<\/p>\n<th>Cross-quota cell<\/th>\n<th>Pop. %<\/th>\n<th>Sample %<\/th>\n<th>Interviews (n)<\/th>\n<th>Weight<\/th>\n<p>\";const body=m.s2.map(c=>{const ext=c.weight<0.4||c.weight>2;return\"<\/p>\n<tr>\n<td>\"+c.label+\"<\/td>\n<td>\"+pct(c.share)+\"<\/td>\n<td>\"+pct(c.sS)+\"<\/td>\n<td>\"+fmt(c.n)+\"<\/td>\n<td><span\"+(ext?' class=\"w-extreme\"':'' )+\">\"+c.weight.toFixed(3)+\"<\/span><\/td>\n<\/tr>\n<p>\";}).join(\"\");const foot=\"<\/p>\n<td>TOTAL SAMPLE<\/td>\n<td>100.0%<\/td>\n<td>100.0%<\/td>\n<td>N = \"+fmt(m.s2Total)+\"<\/td>\n<td><\/td>\n<p>\";$(\"#qsPane-s2\").innerHTML=tableShell(head,body,foot,note);}let s3State=[];\nfunction renderS3(initial){const m=MODEL;const gm=m.global;if(initial){s3State=gm?m.s1.map(c=>Math.max(1,c.n)):m.cells.map(()=>+(m.gE*100).toFixed(1));}\nconst ns=gm?s3State.map(n=>Math.max(1,Math.round(n))):s3State.map(e=>sampleSize(Math.max(0.5,e)\/100));const total=ns.reduce((a,b)=>a+b,0);const rows=m.cells.map((c,i)=>{const sS=ns[i]\/total;return{...c,n:ns[i],sS,weight:c.share\/sS};});const effN=effectiveN(rows);const gEff=marginOf(effN).toFixed(1);\nconst note=\"<\/p>\n<div class='qs-scennote'><span class='tag'>S3<\/span><b>Expert mode \u2014 smart trade-offs.<\/b> \"+(gm?\"Edit <b>n<\/b> cell-by-cell and watch the weights re-balance. Current global error: <b>\u00b1\"+gEff+\"%<\/b> on effective N = \"+fmt(effN)+\".\":\"Relax the margin of error on secondary cells, keep it tight on strategic ones. Global error: \u00b1\"+gEff+\"% on effective N = \"+fmt(effN)+\".\")+\"<\/div>\n<p>\";\nconst editCol=gm?\"<\/p>\n<th>n (edit)<\/th>\n<p>\":\"<\/p>\n<th>Error % (edit)<\/th>\n<p>\";\nconst head=\"<\/p>\n<th>Cross-quota cell<\/th>\n<th>Pop. %<\/th>\n<p>\"+editCol+(gm?\"<\/p>\n<th>Cell error<\/th>\n<p>\":\"<\/p>\n<th>Interviews (n)<\/th>\n<p>\")+\"<\/p>\n<th>Sample %<\/th>\n<th>Weight<\/th>\n<p>\";\nconst body=rows.map(function(c,i){const ext=c.weight<0.4||c.weight>2;const inp=gm?\"<input class='ncell' type='number' data-i='\"+i+\"' value='\"+ns[i]+\"' min='1' step='1'>\":\"<input class='merr' type='number' data-i='\"+i+\"' value='\"+s3State[i]+\"' min='0.5' max='20' step='0.5'>\";const third=gm?\"\u00b1\"+marginOf(c.n).toFixed(1)+\"%\":fmt(c.n);return\"<\/p>\n<tr>\n<td>\"+c.label+\"<\/td>\n<td>\"+pct(c.share)+\"<\/td>\n<td>\"+inp+\"<\/td>\n<td>\"+third+\"<\/td>\n<td>\"+pct(c.sS)+\"<\/td>\n<td><span\"+(ext?' class=\"w-extreme\"':'')+\" >\"+c.weight.toFixed(3)+\"<\/span><\/td>\n<\/tr>\n<p>\";}).join(\"\");\nconst foot=\"<\/p>\n<td>TOTAL SAMPLE<\/td>\n<td>100.0%<\/td>\n<td><\/td>\n<td>N = \"+fmt(total)+\"<\/td>\n<td>100.0%<\/td>\n<td>\u00b1\"+gEff+\"% glob.<\/td>\n<p>\";\nconst guard=\"<\/p>\n<div class='qs-guardrail'><b>Budget guardrail:<\/b> exact pricing varies by country, methodology and incidence rate. You decide whether N = \"+fmt(total)+\" fits your budget.\"+(gm?\" Trim n on low-stakes cells.\":\" Widen the error on low-stakes cells, or fix hard quota caps.\")+\"<\/div>\n<p>\";\n$(\"#qsPane-s3\").innerHTML=tableShell(head,body,foot,note,guard);renderCompare(total);\n$$(\"#qsPane-s3 .merr, #qsPane-s3 .ncell\").forEach(function(inp){inp.addEventListener(\"input\",function(e){const i=+e.target.dataset.i,v=+e.target.value;if(gm){if(!v||v<1)return;s3State[i]=v;}else{if(!v||v<0.5)return;s3State[i]=Math.min(20,v);}const active=document.activeElement===e.target;const pos=active?e.target.selectionStart:null;renderS3(false);if(active){const sel=gm?\".ncell\":\".merr\";const again=$(\"#qsPane-s3 \"+sel+\"[data-i='\"+i+\"']\");again.focus();try{again.setSelectionRange(pos,pos);}catch(_){}}});});}\nlet generated=false;\nfunction generate(){generated=true;computeModel();$(\"#qsEmptyRecap\").style.display=\"none\";$(\"#qsRecapWrap\").style.display=\"flex\";$(\"#qsEmptyOut\").style.display=\"none\";$(\"#qsOutWrap\").classList.add(\"live\");renderKPIs();renderBanner();if(MODEL.simple){$(\"#qsTabsBar\").style.display=\"none\";$(\"#qsTabWrap\").classList.add(\"noround\");showPane(\"s1\");renderSimplePlan();renderCompare();}else{$(\"#qsTabsBar\").style.display=\"flex\";$(\"#qsTabWrap\").classList.remove(\"noround\");renderS1();renderS2();renderS3(true);}}\nfunction showPane(id){$$(\".qs-pane\").forEach(p=>p.style.display=\"none\");$(\"#qsPane-\"+id).style.display=\"flex\";$$(\".qs-tab\").forEach(x=>{const on=x.dataset.t===id;x.classList.toggle(\"on\",on);x.setAttribute(\"aria-selected\",on?\"true\":\"false\");});}\n$$(\".qs-tab\").forEach(t=>t.addEventListener(\"click\",()=>showPane(t.dataset.t)));\n$(\"#qsGoBtn\").addEventListener(\"click\",generate);\nfunction regenIfLive(){if(generated)generate();}\n$(\"#qsNVars\").addEventListener(\"change\",()=>{buildVarBlocks();regenIfLive();});\n$(\"#qsMethod\").addEventListener(\"change\",()=>{refreshMethodNote();refreshVarOptions();buildVarBlocks();regenIfLive();});\n$(\"#qsPrecision\").addEventListener(\"change\",regenIfLive);\n$(\"#qsGErr\").addEventListener(\"input\",regenIfLive);\n$(\"#qsVarsHost\").addEventListener(\"input\",regenIfLive);\n$(\"#qsVarsHost\").addEventListener(\"change\",regenIfLive);\nrefreshMethodNote();refreshVarOptions();buildVarBlocks();\n})();\n}, 0);\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>H H-in-Q &middot; Sample Structure &amp; Quotas Simulator Precision &middot; Feasibility &middot; Budget &mdash; see the trade-offs before fieldwork starts. 1Input &middot; Configuration Quota method Cross quotas (interlocked cells)Simple quotas (marginal, up to 5 vars) Precision target Per sub-target (each cell \/ class readable)Global sample only (total-level reading) Quota variables Margin of error % Generate&#8230;<\/p>","protected":false},"author":12,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7488","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/pages\/7488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/comments?post=7488"}],"version-history":[{"count":5,"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/pages\/7488\/revisions"}],"predecessor-version":[{"id":7495,"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/pages\/7488\/revisions\/7495"}],"wp:attachment":[{"href":"https:\/\/h-in-q.com\/es\/wp-json\/wp\/v2\/media?parent=7488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}