簡単に言えば、機能decimalNumberBySubtracting
しdecimalNumberByDividingBy
ていません...まったく。エラーはありません。結果が台無しになっただけです。私は本当にこれを修正する必要がありますが、エラーが発生しておらず、計算を行うための他の方法は考えられません!! 私は次のような数字を取得しています:
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
大丈夫です。変数deltaTemp
、numerator
、を 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 として定義されているため、数値エンコーディングが問題なく個別に挿入されているため、数値エンコーディングが問題ないと仮定しています...