0

私は3つの要素からなるリストを持っています:

datalist=list(a=datanew1,b=datanew2,c=datanew3)

datalist $ a:

      Inv_ret Firm size  leverage        Risk  Liquidity Equity
17  0.04555968  17.34834 0.1323199 0.011292273 0.02471489      0
48  0.01405835  15.86315 0.6931730 0.002491093 0.12054914      0
109 0.04556252  16.91602 0.1714068 0.006235836 0.01194579      0
159 0.04753472  14.77039 0.3885720 0.007126830 0.06373028      0
301 0.03941040  16.94377 0.1805346 0.005450653 0.01723319      0

datalist $ b:

      Inv_ret Firm size   leverage        Risk  Liquidity      Equity
31  0.04020832  18.13300 0.09326265 0.015235240 0.01579559 0.005025379
62  0.04439078  17.84086 0.11016402 0.005486982 0.01266566 0.006559096
123 0.04543250  18.00517 0.12215307 0.011154742 0.01531451 0.002282790
173 0.03960613  16.45457 0.10828643 0.011506857 0.02385191 0.009003780
180 0.03139643  17.57671 0.40063094 0.003447233 0.04530395 0.000000000

datalist $ c:

   Inv_ret Firm size   leverage       Risk   Liquidity      Equity
92  0.03081029  19.25359 0.10513159 0.01635201 0.025760806 0.000119744
153 0.03280746  19.90229 0.11731517 0.01443786 0.006769735 0.011999005
210 0.04655847  20.12543 0.11622403 0.01418010 0.003125632 0.003802365
250 0.03301018  20.67197 0.13208234 0.01262499 0.009418828 0.021400052
282 0.04355975  20.03012 0.08588316 0.01918129 0.004213846 0.023657440

私は上記でを作成しようとしてcor.testいますdatalist

Cor.tests=sapply(datalist,function(x){ 
  for(h in 1:length(names(x))){

    for(i in 1:length(names(x$h[i]))){
      for(j in 1:length(names(x$h[j]))){
      cor.test(x$h[,i],x$h[,j])$p.value 


    }}}})

しかし、私は:を取得しerrorます

Error in cor.test.default(x$h[, i], x$h[, j]) : 
  'x' must be a numeric vector

私が間違っていることについて何か提案はありますか?

PSデータフレームが1つしかない場合、datanew1

      Inv_ret Firm size  leverage        Risk  Liquidity Equity
17  0.04555968  17.34834 0.1323199 0.011292273 0.02471489      0
48  0.01405835  15.86315 0.6931730 0.002491093 0.12054914      0
109 0.04556252  16.91602 0.1714068 0.006235836 0.01194579      0
159 0.04753472  14.77039 0.3885720 0.007126830 0.06373028      0
301 0.03941040  16.94377 0.1805346 0.005450653 0.01723319      0

私はこれを使用しますloop

results=matrix(NA,nrow=6,ncol=6)
for(i in 1:length(names(datanew1))){
  for(j in 1:length(names(datanew1))){
    results[i,j]<-cor.test(datanew1[,i],datanew1[,j])$p.value 


}}

そして、出力は次のとおりです。

results :
             [,1]         [,2]         [,3]         [,4]         [,5]        [,6]
[1,] 0.000000e+00 7.085663e-09 3.128975e-10 3.018239e-02 4.806400e-10 0.475139526
[2,] 7.085663e-09 0.000000e+00 2.141581e-21 0.000000e+00 2.247825e-20 0.454032499
[3,] 3.128975e-10 2.141581e-21 0.000000e+00 2.485924e-25 2.220446e-16 0.108643838
[4,] 3.018239e-02 0.000000e+00 2.485924e-25 0.000000e+00 5.870007e-15 0.006783324
[5,] 4.806400e-10 2.247825e-20 2.220446e-16 5.870007e-15 0.000000e+00 0.558827862
[6,] 4.751395e-01 4.540325e-01 1.086438e-01 6.783324e-03 5.588279e-01 0.000000000

それはまさに私が欲しいものです。しかし、上記の各要素に1つずつ、合計3つの行列を取得したいと思いdatalistます。

EDIT:ジョランが言うように私がするなら:

Cor.tests=lapply(datalist,function(x){ 

  results=matrix(NA,nrow=6,ncol=6)
  for(i in 1:length(names(x))){
    for(j in 1:length(names(x))){
      results[i,j]<-cor.test(x[,i],x[,j])$p.value 
    }}})

私は得る:

$a
NULL

$b
NULL

$c
NULL
4

2 に答える 2

1

forこれはループなしで実行できます。

1)ベースRのソリューション:

lapply(datalist,
       function(datanew) outer(seq_along(datanew),
                               seq_along(datanew),
                               Vectorize(function(x, y)
                                            cor.test(datanew[ , x],
                                                     datanew[ , y])$p.value)))

2)パッケージを使用したソリューションpsych

library(psych)
lapply(datalist, function(datanew) corr.test(datanew)$p)

質問のアプローチの修正バージョン:

lapply(datalist, function(x) { 
                    results <- matrix(NA,nrow=6,ncol=6)
                    for(i in 1:6){
                       for(j in 1:6){
                          results[i,j]<-cor.test(x[,i],x[,j])$p.value 
                       }
                    }
                    return(results)
                 })

これらのコマンドには2つの大きな問題がありました。

  1. マトリックスresultsは返されませんでした。関数に追加return(results) しました。

  2. データフレームには7つの列があるのに対し、6x6のマトリックスが必要です。ループ内で 置き換え1:length(names(x))ました。1:6for

于 2012-11-07T10:14:14.550 に答える
0

私はあなたに機能するコードを提供しようとはしませんが、うまくいけば、以下があなたが試みているものが機能しない理由を説明するのに役立つでしょう。

sapply通話の最初の数行を見てみましょう。

Cor.tests=sapply(datalist,function(x){ 
  for(h in 1:length(names(x))){
    for(i in 1:length(names(x$h[i]))){

ここで立ち止まって、少し考えてみましょうx$h[i]。この時点で、xは無名関数に渡される引数ですsapply(おそらく、データフレームまたは行列のいずれかですが、それがどちらであるかはあなたの質問からはわかりません)。

コードのこの時点で、何hですか?は前のループhのインデックス変数であるため、最初は値1になります。演算子は、オブジェクトから名前でアイテムを選択するためのものです。名前付きに何かありますか?私はそうは思わない。forh$xh

しかし、内部に名前がi付けられたこの存在しないものの中からth要素を選択しようとすると、事態はさらに悪化します。の値の範囲を定義することになっている式で変数を参照しているので、Rのインタープリターがそれをどのように処理するかさえ正直にわかりません。サーキュラー、誰か?hxii

3番目のforループでのすべての試行を単純に削除すると、運が良くなるはずです。作業バージョンを取得し、無名関数の本体に配置して、出現するすべてのものdatanew1を。に置き換えxます。

幸運を。

lapply(PS-ではなくの出力でもっと幸せになりたいかもしれませんsapply

于 2012-11-06T16:59:05.897 に答える