2016-08-01 40 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