在R中找到非线性相关

时间:2016-08-01 09:59:35

标签: r regression non-linear-regression

我有大约90个变量存储在数据[2-90]中。我怀疑其中有4个与数据有类似抛物线的相关性[1]。我想确定哪些具有相关性。有一个简单快捷的方法吗?

我尝试构建这样的模型(我可以在循环中为每个变量i = 2:90):

y <- data$AvgRating
x <- data$Hamming.distance
x2 <- x^2

quadratic.model = lm(y ~ x + x2)

然后查看R ^ 2 /系数以了解相关性。有没有更好的方法呢?

也许R可以建立一个包含90个变量的回归模型,并选择那些具有重要意义的变量?这有可能吗?我可以在JMP中进行线性回归,但是我不确定我能用R对所有变量进行非线性回归。因此,我手动试图看看我是否能提前看到哪些是相关的。如果有一个功能可以使用它会很有帮助。

3 个答案:

答案 0 :(得分:3)

您可以在R中使用nlcor包。该包可以找到两个数据向量之间的非线性相关性。 有多种估计非线性相关性的方法,例如信息理论。但是,两个变量之间的非线性关系可以采用任何形式。

nlcor对大多数非线性形状都具有鲁棒性。在不同的情况下效果很好。

在较高级别,nlcor通过将数据自适应地分割为线性相关的段来工作。段相关被聚合以产生非线性相关。输出是0到1之间的数字。接近1表示高相关性。与皮尔逊相关性不同,负值不会返回,因为它在非线性关系中没有任何意义。

有关此软件包here

的更多详细信息

要安装nlcor,请按照以下步骤操作:

install.packages("devtools") 
library(devtools)
install_github("ProcessMiner/nlcor")
library(nlcor)

安装后,

# Implementation 
x <- seq(0,3*pi,length.out=100)
y <- sin(x)
plot(x,y,type="l")

sin(x) plot

# linear correlation is small
cor(x,y)
# [1] 6.488616e-17
# nonlinear correlation is more representative
nlcor(x,y, plt = T)
# $cor.estimate
# [1] 0.9774
# $adjusted.p.value
# [1] 1.586302e-09
# $cor.plot

using nlcor for sin(x)

如示例中所示,尽管nlcor可以检测到的变量之间存在明确的关系,但线性相关接近于零。

注意:nlcor中x和y的顺序很重要。 nlcor(x,y)nlcor(y,x)不同。这里的x和y分别代表“独立”和“独立”变量。

答案 1 :(得分:1)

拟合广义加性模型,将帮助您识别曲率 解释变量之间的关系。请阅读第22页的示例here

答案 2 :(得分:1)

另一种选择是计算每对变量之间的互信息分数。例如,使用infotheo package中的mutinformation函数,您可以执行以下操作:

set.seed(1)

library(infotheo)

# corrleated vars (x & y correlated, z noise)
x <- seq(-10,10, by=0.5)
y <- x^2
z <- rnorm(length(x))

# list of vectors
raw_dat <- list(x, y, z)


# convert to a dataframe and discretize for mutual information
dat <- matrix(unlist(raw_dat), ncol=length(raw_dat))
dat <- discretize(dat)

mutinformation(dat)

<强>结果

|   |        V1|        V2|        V3|                                                                                            
|:--|---------:|---------:|---------:|                                                                                            
|V1 | 1.0980124| 0.4809822| 0.0553146|                                                                                            
|V2 | 0.4809822| 1.0943907| 0.0413265|                                                                                            
|V3 | 0.0553146| 0.0413265| 1.0980124| 

默认情况下,mutinformation()计算两个或多个变量之间的离散经验互信息分数。如果使用连续数据将数据转换为离散值,则必须使用discretize()函数。

这可能至少有助于寻找变量之间的非线性关系,如上所述。