private float CalculateUnequalVariance(TTestGroupsDTO tTestGroupsDto) { NumericVector group1 = tTestGroupsDto.Group1; NumericVector group2 = tTestGroupsDto.Group2; _engine.SetSymbol("group1", group1); _engine.SetSymbol("group2", group2); GenericVector testResult = _engine.Evaluate("t.test(group1, group2, var.equal=FALSE)").AsList(); float p = (float)testResult["p.value"].AsNumeric().First(); return(p); }
private async Task <TTestGroupsDTO> CreateGroupsForTTest(BusinessKey businessKey) { var rawData = await _oppeDBService.GetRawDataFactList(businessKey); if (!rawData.Any()) { return(null); } var grp1 = Array.ConvertAll(rawData.Where(r => r.Name == "Peers").Select(r => r.Value).ToArray(), x => (double)x); var grp2 = Array.ConvertAll(rawData.Where(r => r.Name != "Peers").Select(r => r.Value).ToArray(), x => (double)x); var tTestGroupsDto = new TTestGroupsDTO { Group1 = _engine.CreateNumericVector(grp1), Group2 = _engine.CreateNumericVector(grp2) }; return(tTestGroupsDto); }
public async Task <PValueDTO> GeneratePValueFactRecord(BusinessKey businessKey) { float leveneValue = 0; float pValueUnequalVariance = 0; float pValueEqualVariance = 0; float chiRatio = 0; float pValue = 0; var phys = await _oppeDBService.GetRawDataFactList(businessKey); var physCount = phys.Count(p => p.Name != "Peers"); float physSum = (float)phys.Where(p => p.Name != "Peers").Sum(p => p.Value); float physMean = (float)(physCount == 0 ? 0 : physSum / physCount); var peersCount = phys.Count(p => p.Name == "Peers"); float peersSum = (float)phys.Where(p => p.Name == "Peers").Sum(p => p.Value); float peersMean = (float)(peersCount == 0 ? 0 : peersSum / peersCount); if (businessKey.isTTest) { LeveneTestDTO leveneTestDTO = await CreateGroupsForLevene(businessKey); if (leveneTestDTO == null) { return(null); } leveneValue = CalculateLeveneValue(leveneTestDTO); TTestGroupsDTO tTestGroupsDto = await CreateGroupsForTTest(businessKey); if (tTestGroupsDto == null) { return(null); } pValueUnequalVariance = CalculateUnequalVariance(tTestGroupsDto); pValueEqualVariance = CalculateEqualVariance(tTestGroupsDto); pValue = leveneValue > 0.05 ? pValueEqualVariance : pValueUnequalVariance; if (float.IsNaN(leveneValue) || float.IsNaN(pValueUnequalVariance) || float.IsNaN(pValueEqualVariance)) { return(null); } } else { if (phys.Any()) { CalculateChiForPhys(phys, out chiRatio, out pValue); } } PValueDTO pValueDTO = new PValueDTO { CycleId = businessKey.CycleId, SubGroupId = (int)businessKey.SubGroupId, IndicatorId = (int)businessKey.IndicatorId, PayrollId = businessKey.PayrollId, PhysicianCount = physCount, PhysicianSum = physSum, PhysicianMean = physMean, PeersCount = peersCount, PeersSum = peersSum, PeersMean = peersMean, LeveneValue = leveneValue, PValueUnequalVariance = pValueUnequalVariance, PValueEqualVariance = pValueEqualVariance, ChiRatio = chiRatio, PValue = pValue }; return(pValueDTO); }