2016-08-01 99 views
4

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

我试图建立这样一个模型(我可以在一个循环为每个变量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对所有变量进行非线性回归。因此,我正在手动尝试查看是否可以预先查看哪些关联了。如果有一个函数用于这个功能将会很有帮助。

+0

'data'的结构是什么?它是一个向量列表吗?所有的矢量长度是否相同? –

+0

它们的长度都一样。我用 data = read.csv(“file”,header = TRUE)读入它们。我认为它必须处理标题,我改变了问题以反映工作代码。 – dorien

+1

如果'data'是'data.frame',那么'data [1]'给你一个'data.frame'列,而'lm'需要一个向量。使用'data [[1]]来获得向量。 – snaut

回答

1

另一种选择是计算每对变量之间的互信息分数。例如,使用mutinformation功能从infotheo package,你可以这样做:

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()函数。

这可能有助于至少作为寻找变量之间的非线性关系的第一次刺探,如上所述。

+0

我可以使用这个为了arb意向数据集,即不一定是静止的?谢谢 –

+0

Hi @pythonnovice,我之前没有使用过这种类型的数据,所以我无法确定地说。可能最简单的做法是模拟一些简单的非平稳数据并尝试一下。 –

1

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

+0

谢谢,我尝试过使用gam函数。虽然我得到一个关于自由度太小的错误,所以我想我应该首先为每个变量做这个,看看哪个最适合。或者我缺少一个函数,gam可以识别这些变量? – dorien