For Loop for Correlations

时间:2018-02-09 14:55:43

标签: r performance for-loop correlation

我想获得每个县的两个变量之间的相关值。

我有如下所示的数据子集,并为各个亚当斯县获得适当的价值,但我现在想要做其他县:

    CorrData<-read.csv("H://Correlation 
     Datasets/CorrelationData_Master_Regression.csv")
     CorrData2<-subset(CorrData, CountyName=="Adams")
     dzCases<-(cor.test(CorrData2$NumVisit, CorrData2$dzdx, 
      method="kendall"))
dzCases

我想做一个For循环或类似的东西,这会使这个过程更有效率,所以我不会为93个县中的每个县写20个不同的变量相关。

当我在R中运行以下内容时,它并没有给出错误,但它并没有给我我希望的响应。它似乎忽略了循环部分而只是给了我所有县的两个变量之间的相关性,而不是每个县的斯皮尔曼相关性。

    CorrData<-read.csv("H:\\CorrelationData_Master_Regression.csv")
     for (i in CorrData$CountyName)
     {
     dzCasesYears<-cor.test(CorrData$NumVisit, CorrData$dzdx, 
     method="spearman")
     }

我的数据的一小部分样本与此类似:

CountyName  Year    NumVisits        dzdx
Adams       2010    4.545454545      1.19           
Adams       2011    20.83333333      0.20           
Elmore      2010    26.92307692      0.24       
Elmore      2011    0                0.61           
Brown       2010    0               -1.16           
Brown       2011    17.14285714     -1.28           
Clark       2010    25              -1.02           
Clark       2011    0                1.13           
Cass        2010    17.85714286      0.50       
Cass        2011    27.55102041      0.11

我试图在网上找到类似的例子,但我没有运气!

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你正在循环但没有使用你的迭代器&#39;我&#39;在你的代码中。如果这对于你想做的事情是有意义的(并根据你的情况判断)。根据评论,您可能希望确保使用数字。另外,我注意到你没有迭代到输出cor.test向量。我不确定循环是最有效的方法,但它会很好,因为你开始循环,你应该有类似的东西:

 dzCasesYears = list() #Prep a list to store your corr.test results
 counter = 0 # To store your corr.test into list through iterating

 for (i in unique(CorrData$CountyName))
 {
 counter = counter + 1
 # Creating new variables makes the code clearer
 x = as.numeric(CorrData[CorrData$CountyName == i,]$NumVisit)
 y = as.numeric(CorrData[CorrData$CountyName == i,]$dzdx)

 dzCasesYears[[counter]] <-cor.test(x,y,method="spearman")

 }

当你进行迭代时,将独特的东西放在那里总是好的。

答案 1 :(得分:0)

data.table使这样的操作变得非常简单。

library('data.table')
CorrData <- as.data.table(read.csv("H:\\CorrelationData_Master_Regression.csv"))
CorrData[, cor(dzdx, NumVisits), CountyName]

对于样本数据,它都是负数,因为每个县有两个点,因此相关性是完美的。完整的数据集应该更有趣!

   CountyName V1
1:      Adams -1
2:     Elmore -1
3:      Brown -1
4:      Clark -1
5:       Cass -1

编辑以在评论中包含来自cor.test的p值作为OP询问 这也很简单!

CorrData[, .(cor=cor(dzdx, NumVisits),
             p=cor.test(dzdx, NumVisits)$p.value),
             CountyName]

...但它不能处理您的样本数据,因为每个县的两个点不足以让cor.test获得p值。也许您可以采用@ smci的建议和dput更大的数据子集来使您的问题真正可重现