2013-06-04 5 views
5

mam ten programZastosowanie przesunięcie w regresję 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) 

i chcę zrobić najmniejszych kwadratów regresji na danych zawartych w DAT funkcja ma postać

y ~ a + b*x 

i chcę, aby linia regresji przechodziła przez określony punkt P (x0, y0) (który nie jest początkiem).

Staram się robić to tak

x0 <- 3.15 

y0 <-283.56 

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

(myślę, że data = dat nie jest konieczne w tym przypadku), ale mam ten błąd:

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

I don” wiesz dlaczego. Sądzę, że nie zdefiniowałem poprawnie wartości przesunięcia, ale nie mogłem znaleźć żadnego przykładu w Internecie.

Czy ktoś może mi wyjaśnić, jak działa przesunięcie?

+0

można zapewnić powtarzalną przykład, z danych, proszę? – joran

+2

Jaka jest różnica między tym pytaniem a poprzednim? – agstudy

+0

Teraz proszę o zdefiniowanie obiektu, który przechodzi w _offset_. Moje poprzednie pytanie dotyczyło sposobu, w jaki regresja przechodzi do określonego punktu. – amcabassi

Odpowiedz

9

Twoje przesunięcie musi być zmienną , taką jak x i y, a nie stałą numeryczną. Dlatego musisz utworzyć kolumnę w zestawie danych z odpowiednimi wartościami.

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

Dzięki za odpowiedź. Dodałem punkt P (x0, y0) do mojej bazy danych. Teraz jest to 161 element _dat_. Próbowałem zarówno x0 <- 3,15 y0 <- dat [161,2] regresji <- lm (y ~ I (x-x0) -1, przesunięcie = y0) ' i ten ' y0 <- dat [161,] regresja <- lm (y ~ I (x) -1, offset = y0) 'ale żadna z nich nie działa. Co ja robię źle? Dodałem pierwszą część kodu do mojego pytania, aby było jaśniejsze. – amcabassi

+2

Wciąż tworzysz pojedynczą stałą o podanej wartości. Musisz przekazać _vector_ wartości jako przesunięcie. Najłatwiej to zrobić tak, jak napisałem: utwórz nową kolumnę w zbiorze danych. Zakładam, że 'dat [161, 2]' jest tym, jaki powinien być twój y0? Zrób to: 'dat $ o <- dat [161,2]; lm (y ~ I (x - x0) - 1, offset = o, data = dat) ' –

+0

Doskonale, dziękuję bardzo! Stworzyłem wiersz zamiast kolumny, dlatego to nie zadziałało! Dziękuję za cierpliwość. – amcabassi

2

W rzeczywistości prawdziwym problemem jest to, że należy określić offset wektorem, którego długość wynosi taka sama jak liczba wierszy (lub długość, jeśli dane składa jako wektor) Twojego dane. Poniższy kod będzie wykonywać swoją pracę zgodnie z oczekiwaniami:

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

Tutaj jest dobrym wytłumaczeniem dla tych, którzy są zainteresowani: http://rfunction.com/archives/223