在 R 中寻找非线性相关性

dor*_*ien 6 regression r non-linear-regression

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

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

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

quadratic.model = lm(y ~ x + x2)
Run Code Online (Sandbox Code Playgroud)

然后查看 R^2/系数以了解相关性。有没有更好的方法来做到这一点?

也许 R 可以用 90 个变量建立一个回归模型并选择那些本身显着的变量?这有可能吗?我可以在 JMP 中为线性回归执行此操作,但我不确定是否可以使用 R 对所有变量进行非线性回归。因此,我手动尝试查看是否可以提前查看哪些是相关的。如果有一个函数可以用来做这件事会很有帮助。

vah*_*ari 6

您可以nlcor在 R 中使用包。这个包找到两个数据向量之间的非线性相关性。有不同的方法来估计非线性相关性,例如 infotheo。然而,两个变量之间的非线性相关可以采取任何形式。

nlcor对大多数非线性形状具有鲁棒性。它在不同的场景下工作得很好。

在高层次上,nlcor通过自适应地将数据分割成线性相关的段来工作。段相关性被聚合以产生非线性相关性。输出是 0 到 1 之间的数字。接近 1 意味着高相关性。与 pearson 相关不同,不会返回负值,因为它在非线性关系中没有意义。

关于这个包的更多细节在这里

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

install.packages("devtools") 
library(devtools)
install_github("ProcessMiner/nlcor")
library(nlcor)
Run Code Online (Sandbox Code Playgroud)

安装后,

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

sin(x) 图

# 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
Run Code Online (Sandbox Code Playgroud)

对 sin(x) 使用 nlcor

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

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


Kei*_*itt 1

另一种选择是计算每对变量之间的互信息得分。例如,使用infotheo 包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)
Run Code Online (Sandbox Code Playgroud)

结果

|   |        V1|        V2|        V3|                                                                                            
|:--|---------:|---------:|---------:|                                                                                            
|V1 | 1.0980124| 0.4809822| 0.0553146|                                                                                            
|V2 | 0.4809822| 1.0943907| 0.0413265|                                                                                            
|V3 | 0.0553146| 0.0413265| 1.0980124| 
Run Code Online (Sandbox Code Playgroud)

默认情况下,mutinformation()计算两个或多个变量之间的离散经验互信息得分。discretize()如果您正在处理连续数据并将数据转换为离散值,则该函数是必需的。

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