简而言之,decimalNumberBySubtracting
根本decimalNumberByDividingBy
不工作。没有错误,只是搞砸了结果。我真的需要解决这个问题,但我没有收到任何错误,我想不出任何其他方法来进行计算!我得到如下数字:
257849691392950000000000000000000000000000000000000000000000000000000000000000000
他们应该评估的地方:
-0.581
这是长篇大论。我正在尝试对数据集进行简单的 Z-Score 计算。AZscore
定义为(X - Average)/(stdDev)
。很简单。我的测试数据包括 5 个板,每个板有 96 个样本。此代码识别每个单独的板,为每个板生成平均值和标准差,然后对于该板中的每个样本,执行上述计算。
//identify unique plates
NSSet * uniqueValues = [NSSet setWithArray:[items valueForKey:@"plate"]];
id i;
for (i in uniqueValues) {
//Lots of NSExpression and Predicate stuff I pulled out cause its working fine
NSExpression *plateMeanExpression = [NSExpression expressionForFunction:@"average:"
arguments:plateArgumentArray];
NSExpression *plateStdDevExpression = [NSExpression expressionForFunction:@"stddev:"
arguments:plateArgumentArray];
// generate Z Score and StDev:
NSDecimalNumber *zscoreMean = [plateMeanExpression expressionValueWithObject:nil
context:nil];
NSDecimalNumber *zscoreStdDev = [plateStdDevExpression expressionValueWithObject:nil
context:nil];
//iterate through samples in each plate and perform calculation, update CoreData
for (ScreenVariables *zValue in eachPlateArray) {
NSDecimalNumber *deltaTemp = [zValue valueForKey:@"delta"];
NSDecimalNumber *numerator = [deltaTemp decimalNumberBySubtracting:zscoreMean];
NSDecimalNumber *zScoreValue = [numerator decimalNumberByDividingBy:zscoreStdDev];
[zValue setZScore:zScoreValue];
问题是,当我运行这个计算时,我应该从 ~(-6,6) 中得到一个数字,其中 99% 的值介于 -3 和 3 之间。返回的一个数据点是:
257849691392950000000000000000000000000000000000000000000000000000000000000000000
好吧,我通过将变量deltaTemp
, numerator
,插入到我的 NSTableView 中zscoreMean
进行了一些故障排除。zscoreStdDev
这个想法是看看 XCode 评估这些变量的目的是什么,并解决哪个是麻烦制造者。是否使用此代码:
ScreenVariables *addData = [NSEntityDescription insertNewObjectForEntityForName:@"ScreenVariables"
inManagedObjectContext:self.managedObjectContext];
[addData setValue:deltaTemp forKey:@"someAvailableKey-1"];
[addData setValue:numerator forKey:@"someAvailableKey-2"];
[addData setValue:zscorePlateMean forKey:@"someAvailableKey-3"];
[addData setValue:zscoreStdDev forKey:@"someAvailableKey-4"];
我得到了变量的值:
deltaTemp = -919
zscoreMean = -141
numerator = -919 // should be -778.58 = -919 -(-141)
zscoreStdDev = 1337.635067946411
这计算为 Z 分数 = -0.581...
这是一个完全有效的 ZScore ......所以问题出在:
[deltaTemp decimalNumberBySubtracting:zscoreMean];
[numerator decimalNumberByDividingBy:zscoreStdDev];
变量分子没有正确评估,zscore 值也没有。我的 CoreData DataModel 特别将每个数字变量的输入类型定义为 NSDecimalNumber 所以我假设我的数字编码很好,因为它们被单独插入而没有任何问题......