3

Statistics::PCAパッケージを使用して、いくつかの遺伝子バリアントに対して PCA を実行しようとしています。このパッケージでは、リストのリストを読み取る必要があります (私が正しく理解していれば、それは配列の配列である可能性がありますよね?)。

以下は、各個人の配列を作成するコードの一部です (各個人は、「SV」と呼ばれる遺伝的変異の有無を表す 0 と 1 で満たされた配列を取得する実際の人間の被験者です)。 @LoL_SVs と呼ばれる配列の配列にそれらをプッシュします。

my @LoL_SVs;

foreach (@individuals) {
    my $ind = $_;
    foreach (@all_SVs) {
        if ($SV{$ind}{$_} != 1) {
            push(@{$SVs{$ind}}, "0");
        }
        if ($SV{$ind}{$_} == 1) {
            push(@{$SVs{$ind}}, "1");
        }
    }
    push @LoL_SVs, [ @{$SVs{$ind}} ];
} 

次に、モジュールのCPAN Web サイトで説明されているようにデータをロードしようとします (段落 *load_data* を参照)。

use Statistics::PCA;

my $pca = Statistics::PCA->new;

$pca->load_data ( { format => 'table', data => @LoL_SVs, } ); 
# ^ this line is where it goes wrong

残念ながら、これは機能せず、次のエラー メッセージが表示されます。

/home/abdel/myperl/share/perl/5.10.1/Statistics/PCA.pm の 189 行目で「厳密な参照」が使用されている間は、文字列 (「0」) を ARRAY 参照として使用できません。

ここで何がうまくいかないのでしょうか?

問題が明確に特定されていることを願っています。それ以外の場合は、さらに情報が必要な場合はお知らせください。どうもありがとう!

4

1 に答える 1

5

load_data通話のオプションには次のものが含まれます。

data => @LoL_SVs

ドキュメントでは、このように説明されていますが、

data => [ \@Obs1, \@Obs2, \@Obs3, \@Obs4, \@Obs5 ], 

配列をロードしようとしましたが、モジュールは配列参照 (おそらく配列参照の) を想定しています。そのため、空の配列をスカラー引数として渡そうとすると、0(要素が 0 であるため) と評価されます。に似ている:

my @bar;
my $foo = @bar;   # @bar is empty, $foo is 0
print $foo->[0];  # Can't use string ("0") as ARRAY ref ...

への参照を渡すことで、問題@LoL_SVs解決する場合があります。

data => \@LoL_SVs

補足として、あなたが使っているのは良いことです

use strict;

そして、私もあなたが使っていることを願っています

use warnings;

strictのような変数名がある場合とない@LoL_SVs場合は、タイプミスが非常に起こりやすく、@Lol_Svsバグの検出が困難になります。を使用しないwarningsと、そのようなバグを見つけるのはさらに難しくなります。

于 2013-04-11T11:55:08.927 に答える