viewof settings = Inputs.form([
Inputs.range([-5, 5], {value: 1, label: tex`\text{pop mean, }\mu`, step: 0.01}),
Inputs.range([0.01, 5], {value: 1, label: tex`\text{pop stdev, }\sigma`, step: 0.01}),
Inputs.range([0, 99], {value: 90, label: "confidence level", step: 1}),
Inputs.range([0, 200], {value: 50, label: "sample size, n", step: 1})
])Simulation of Confidence Interval for Population Mean with Known Variance
textinfo = md`
Out of a total of ${nrep} samples, ${d3.sum(data.map(d => d.rep <= nrep && (mu >= d.lower && mu <= d.upper)))} (**<span style="color:red">${(d3.sum(data.map(d => d.rep <= nrep && (mu >= d.lower && mu <= d.upper)))*100/nrep).toFixed(3)}%</span>**) of the ${confidence}% confidence intervals contained the true population mean ${tex`\mu= `} ${mu}.
`plt = Plot.plot({
width: 1600, // or a dynamic value based on `width` variable
height: 600,
style: {fontSize: "20px"},
y: {
label: "mean",
domain: lockvertical ? [mu- 3, mu + 3] : [mu - 5*sigma/Math.sqrt(nobs),mu + 5*sigma/Math.sqrt(nobs)]
},
x: {
label: "sample number",
domain: [0, nrep]
},
marks: [
Plot.ruleX([0]),
Plot.ruleX(data, {
filter: d => (d.rep <= nrep && mu >= d.lower && mu <= d.upper),
x: "rep",
y1: "lower",
y2: "upper",
stroke: "steelblue",
strokeWidth: 2.5
}),
Plot.dot(data, {filter: d => (d.rep <= nrep && mu >= d.lower && mu <= d.upper), x: "rep", y: "xbar", fill: "steelblue", r: 3}),
Plot.ruleX(data, {
filter: d => d.rep <= nrep && (mu < d.lower || mu > d.upper),
x: "rep",
y1: "lower",
y2: "upper",
stroke: "orange",
strokeWidth: 3.5
}),
Plot.dot(data, {filter: d => d.rep <= nrep && (mu < d.lower || mu > d.upper), x: "rep", y: "xbar", fill: "orange", r: 3}),
Plot.ruleY([mu], {stroke: "#D22B2B", strokeWidth: 2.5})
]
})function simulate_means(mu, sigma, nobs, nrep){
const tvalue = jstat.studentt.inv(1-(1-(confidence/100))/2, nobs-1);
var data = [];
for (let j = 1; j <= nrep; j++){
let sample = d3.range(nobs).map(d => d3.randomNormal(mu,sigma)())
let xbar = d3.mean(sample)
let s = jstat.stdev(sample, true)
let lower = xbar - tvalue*s/Math.sqrt(nobs)
let upper = xbar + tvalue*s/Math.sqrt(nobs)
data.push({rep: j, xbar: xbar, lower: lower, upper: upper})
}
return data
}