在 R 中寻找非线性相关性
Finding non-linear correlations in R
我在data[2-90]中存储了大约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 对所有变量进行非线性回归。因此,我手动尝试查看是否可以提前查看哪些是相关的。如果有一个功能可用于此,那将会很有帮助。
拟合广义相加模型,将帮助您识别曲率
解释变量之间的关系。阅读第 22 页的示例 here。
另一种选择是计算每对变量之间的互信息分数。例如,使用 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()
函数是必需的。
这至少作为寻找变量之间非线性关系的第一步可能会有帮助,如上所述。
您可以使用 R 中的 nlcor
程序包。此程序包会发现两个数据向量之间的非线性相关性。
有不同的方法来估计非线性相关性,例如 infotheo。然而,两个变量之间的非线性相关性可以是任何形状。
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")
# 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
如示例所示,尽管变量之间存在明确的关系 nlcor
可以检测到,但线性相关性接近于零。
注意:nlcor
中 x 和 y 的顺序很重要。 nlcor(x,y)
不同于 nlcor(y,x)
。这里的 x 和 y 分别代表 'independent' 和 'dependent' 变量。
我在data[2-90]中存储了大约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 对所有变量进行非线性回归。因此,我手动尝试查看是否可以提前查看哪些是相关的。如果有一个功能可用于此,那将会很有帮助。
拟合广义相加模型,将帮助您识别曲率 解释变量之间的关系。阅读第 22 页的示例 here。
另一种选择是计算每对变量之间的互信息分数。例如,使用 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()
函数是必需的。
这至少作为寻找变量之间非线性关系的第一步可能会有帮助,如上所述。
您可以使用 R 中的 nlcor
程序包。此程序包会发现两个数据向量之间的非线性相关性。
有不同的方法来估计非线性相关性,例如 infotheo。然而,两个变量之间的非线性相关性可以是任何形状。
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")
# 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
如示例所示,尽管变量之间存在明确的关系 nlcor
可以检测到,但线性相关性接近于零。
注意:nlcor
中 x 和 y 的顺序很重要。 nlcor(x,y)
不同于 nlcor(y,x)
。这里的 x 和 y 分别代表 'independent' 和 'dependent' 变量。