2013-06-04 90 views
5

我有這個計劃使用的LM迴歸偏移 - R的

dens <- read.table('DensPiu.csv', header = FALSE) 
fl <- read.table('FluxPiu.csv', header = FALSE) 
mydata <- data.frame(c(dens),c(fl)) 

dat = subset(mydata, dens>=3.15) 
colnames(dat) <- c("x", "y") 
attach(dat) 

,我想做包含在DAT數據最小二乘迴歸,函數的形式

y ~ a + b*x 

我想讓迴歸線通過一個特定點P(x0,y0)(這不是原點)。

我試圖做這樣的

x0 <- 3.15 

y0 <-283.56 

regression <- lm(y ~ I(x-x0)-1, offset=y0) 

(我認爲數據= DAT沒有必要在這種情況下),但我有這樣的錯誤:

Error in model.frame.default(formula = y ~ I(x - x0) - 1, : variable 
lengths differ (found for '(offset)'). 

我不不知道爲什麼。我想我沒有正確定義偏移值,但我在互聯網上找不到任何示例。

有人可以解釋我如何抵消工作請嗎?

+0

你可以提供一個可重複的例子,有數據嗎? – joran

+2

這個問題和你以前的問題有什麼區別? – agstudy

+0

現在我要求定義_offset_中的對象。我之前的問題是關於如何爲特定點進行迴歸傳遞。 – amcabassi

回答

9

您的抵消條款必須是變量,如xy,不是數字常數。所以你需要用適當的值在你的數據集中創建一個列。

dat$o <- 283.56 
lm(y ~ I(x - x0) - 1, data=dat, offset=o) 
+0

感謝您的回答。我已將點P(x0,y0)添加到我的數據庫中。現在它是_dat_的161元素。我已經嘗試過兩種方法,一種方法是使用'x0 < - 3.15 y0 < - dat [161,2] 迴歸<-lm(y〜I(x-x0)-1,offset = y0)' 和這個 'y0 < dat [161,] 迴歸< - lm(y〜I(x)-1,offset = y0)'但它們都不起作用。我究竟做錯了什麼?爲了使它更清晰,我在代碼中添加了第一部分代碼。 – amcabassi

+2

您仍然創建一個具有給定值的單個常量。您需要傳遞值的_vector_作爲偏移量。最簡單的方法就像我發佈的那樣:在數據集中添加一個新列。我假設'dat [161,2]'是你的y0應該是什麼?這樣做:'dat $ o < - dat [161,2]; lm(y〜I(x - x0) - 1,offset = o,data = dat)' –

+0

完美,非常感謝!我創建了一行而不是一列,這就是爲什麼它不起作用!謝謝你的耐心。 – amcabassi

2

實際上,這裏真正的問題是,你應該用一個向量,其長度爲一樣行數(或長度,如果數據是由作爲載體)指定offset您數據。下面的代碼會做你的工作,如預期:

regression <- lm(y ~ I(x-x0)-1, offset = rep(y0, length(y)) 

這裏是那些有興趣誰了很好的解釋: http://rfunction.com/archives/223