0

我有一个由 3 个元素组成的列表:

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

数据列表$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

数据列表$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

数据列表$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.testdatalist上面创建一个:

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如果我只有一个数据框,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

这正是我想要的。但我想得到 3 个矩阵,一个用于datalist上述每个元素。

EDIT: 如果我按照 Joran 所说的那样做:

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)
                 })

这些命令有两个主要问题:

  1. results未返回矩阵。我添加return(results) 到函数中。

  2. 您想要一个 6 x 6 矩阵,而您的数据框有七列。我在 循环中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(可能是数据框或矩阵,我无法从您的问题中确定它是什么)。

此时在您的代码中,什么是hh是前一个for循环中的索引变量,因此初始h值为 1。该运算符用于按名称$从对象中选择项目。有什么东西在命名吗?我想不是。xh

但是,当您尝试在名为insidei的这个不存在的事物中选择第 th 个元素时,情况会变得更糟。老实说,我什至不确定 R 的解释器会用它做什么,因为您在表达式中引用了应该定义. 圆形的,有人吗?hxii

如果您只是在第三个 for 循环中删除所有尝试,您应该有更多的运气。只需获取工作版本,将其放入匿名函数的主体中,然后将每次出现的地方都替换datanew1x.

祝你好运。

lapply(PS - 您可能希望对而不是的输出更满意sapply

于 2012-11-06T16:59:05.897 回答