求解释:基于面包偏好概率计算相关系数的JavaScript代码
面包品牌偏好相关系数代码逻辑解释
现有一大型群体被调查面包品牌偏好(可选A、B、C),其中偏好A的比例为pA,偏好B的比例为pB,剩余群体偏好C。以下是对这段计算相关系数的JavaScript代码的逐行逻辑解释:
function correlationCoefficient(pA, pB) { let covXY = -pA * pB let varX = pA * (1-pA) let varY = (1-pB)* pB let res = covXY / (Math.sqrt(varX*varY, 2)) return res }
核心逻辑前提
这段代码计算的是两个0-1指示变量的皮尔逊相关系数:
- 变量X:代表「是否偏好A」(1=是,0=否)
- 变量Y:代表「是否偏好B」(1=是,0=否)
由于一个人只能选一个品牌,X和Y不可能同时为1,这是理解所有计算的关键。
逐行解释
协方差计算:
let covXY = -pA * pB
协方差的公式是E[XY] - E[X]E[Y]。因为X和Y无法同时为1,所以E[XY](XY的期望值)为0;而E[X]是X的期望值即pA,E[Y]是Y的期望值即pB,代入后得到协方差为0 - pA*pB = -pA*pB。X的方差计算:
let varX = pA * (1-pA)
X是伯努利分布(0-1分布)的变量,这类变量的方差公式就是p*(1-p),这里直接用偏好A的比例pA套用公式即可。Y的方差计算:
let varY = (1-pB)* pB
和X同理,Y也是伯努利分布变量,用偏好B的比例pB套用伯努利方差公式。相关系数计算:
let res = covXY / (Math.sqrt(varX*varY, 2))
皮尔逊相关系数的公式是「协方差 ÷ 两个变量标准差的乘积」。其中:Math.sqrt(varX*varY)等价于sqrt(varX) * sqrt(varY),也就是两个变量的标准差相乘- 注意:
Math.sqrt只需要一个参数,这里的第二个参数2是无效的,但不影响结果(因为sqrt默认就是开平方)
结果意义
最终返回的相关系数为负数,符合实际逻辑:偏好A的人越多,偏好B的人就越少,两者呈负相关关系。
内容的提问来源于stack exchange,提问作者JsDeV
相关产品推荐
相关产品推荐

