1

简而言之,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 所以我假设我的数字编码很好,因为它们被单独插入而没有任何问题......

4

1 回答 1

1
NSDecimalNumber *zscoreMean = [plateMeanExpression  expressionValueWithObject:nil context:nil];
NSDecimalNumber *zscoreStdDev = [plateStdDevExpression expressionValueWithObject:nil context:nil];

这些正在评估 NSNumber 对象,而不是 NSDecimalNumber 对象......不知道为什么我没有收到任何错误。

    NSNumber *expMean = [plateMeanExpression  expressionValueWithObject:nil context:nil];
    NSNumber *expStdDev = [plateStdDevExpression expressionValueWithObject:nil context:nil];

    NSDecimalNumber *zscoreMean = [NSDecimalNumber decimalNumberWithDecimal:[expMean decimalValue]];
    NSDecimalNumber *zscoreStdDev = [NSDecimalNumber decimalNumberWithDecimal:[expStdDev decimalValue]];

这很好用。

于 2010-02-01T19:22:27.413 回答