// SPDX-License-Identifier: WTFPL /* * Cohen's dの計算。比較する集合のサンプル数は等しいものとする。 * 参考文献: * https://en.wikipedia.org/wiki/Effect_size#Cohen.27s_d * http://www.mizumot.com/method/mizumoto-takeuchi.pdf * http://www.socscistatistics.com/effectsize/Default3.aspx */ #include #include static double calc_cohens_d(double u1, double s1, double u2, double s2) { /* 変動係数の二乗を計算 (CV = sd / mean) */ double cv1_sq = (s1 * s1) / (u1 * u1); double cv2_sq = (s2 * s2) / (u2 * u2); /* 変動係数を使用して分散を対数化 (σy^2 = ln(1 + CV^2) */ double v1_sq = log(1.0 + cv1_sq); double v2_sq = log(1.0 + cv2_sq); /* 平均を対数化 (μy = ln(mean) - (σy^2 / 2)) */ double mu1 = log(u1) - (v1_sq / 2.0); double mu2 = log(u2) - (v2_sq / 2.0); /* cohen's dの算出 */ return (mu1 - mu2) / sqrt((v1_sq + v2_sq) / 2.0); } int main(int argc, char *argv[]) { char name[256]; double d1, mean1_1, sd1_1, mean1_2, sd1_2; double d2, mean2_1, sd2_1, mean2_2, sd2_2; /* d1:(集合1-1, 集合1-2) d2:(集合2-1, 集合2-2) を計算 */ while (scanf("%s %lf %lf %lf %lf %lf %lf %lf %lf", name, &mean1_1, &sd1_1, &mean1_2, &sd1_2, &mean2_1, &sd2_1, &mean2_2, &sd2_2) != EOF) { d1 = calc_cohens_d(mean1_1, sd1_1, mean1_2, sd1_2); d2 = calc_cohens_d(mean2_1, sd2_1, mean2_2, sd2_2); printf("%s %f %f\n", name, d1, d2); } return 0; }