/// <summary> /// 統計情報を計算し格納する /// z = 0.904をデフォルトとする、このとき中央値から65%を網羅できる /// </summary> /// <param name="z">標準正規分布表のZ</param> public void CalcMedianBoneRange(double z = 0.904) { foreach (Bone bone in this.bones) { List <double> data = this.boneLengthSqLog[bone]; int skip = (int)(data.Count() * 0.3); int take = data.Count() - skip * 2; data.Sort(); // 上下30%を削除 data = data.Skip(skip).Take(take).ToList(); double median = CalcEx.GetMedian(data); double average = data.Average(); double std = Math.Abs(Math.Sqrt(data.Select(d => Math.Pow(d - average, 2)).Sum() / (data.Count() - 1))); double minLength = median - std * z; double maxLength = median + std * z; BoneStatistics bs = new BoneStatistics(minLength, maxLength, median, average, std); this.boneLengthSqStatistics.Add(bone, bs); } }
/// <summary> /// 統計情報を計算し格納する /// z = 0.904をデフォルトとする、このとき中央値から65%を網羅できる /// </summary> /// <param name="z">標準正規分布表のZ</param> public void CalcMedianBoneRange(double z = 0.904) { foreach (Bone bone in this.bones) { List<double> data = this.boneLengthSqLog[bone]; int skip = (int)(data.Count() * 0.3); int take = data.Count() - skip * 2; data.Sort(); // 上下30%を削除 data = data.Skip(skip).Take(take).ToList(); double median = CalcEx.GetMedian(data); double average = data.Average(); double std = Math.Abs(Math.Sqrt(data.Select(d => Math.Pow(d - average, 2)).Sum() / (data.Count() - 1))); double minLength = median - std * z; double maxLength = median + std * z; BoneStatistics bs = new BoneStatistics(minLength, maxLength, median, average, std); this.boneLengthSqStatistics.Add(bone, bs); } }