1

簡単に言えば、機能decimalNumberBySubtractingdecimalNumberByDividingByていません...まったく。エラーはありません。結果が台無しになっただけです。私は本当にこれを修正する必要がありますが、エラーが発生しておらず、計算を行うための他の方法は考えられません!! 私は次のような数字を取得しています:

2578496913929500000000000000000000000000000000000000000000000000000000000000

評価すべき場所:

-0.581

これが長い話です。データセットで単純な Z スコア計算を実行しようとしています。AZscoreは として定義され(X - Average)/(stdDev)ます。ものすごく単純。テスト データには、それぞれ 96 サンプルの 5 つのプレートが含まれています。このコードは、個々のプレートを識別し、各プレートの平均値と標準偏差を生成し、次にそのプレートの各サンプルに対して上記の計算を実行します。

//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];

問題は、この計算を実行すると、値の 99% が -3 から 3 の間にある ~(-6,6) の数値を取得する必要があることです。返される 1 つのデータ ポイントは次のとおりです。

2578496913929500000000000000000000000000000000000000000000000000000000000000

大丈夫です。変数deltaTempnumerator、を NSTableViewzscoreMeanに挿入して、トラブルシューティングを行いました。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];

これらは NSDecimalNumber オブジェクトではなく NSNumber オブジェクトに評価されていました...なぜエラーが発生しなかったのかわかりません。

    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 に答える