2013-10-27 5 views
3

У меня есть следующие данные:Как построить линейную регрессию на двойной логарифмический график R?

someFactor = 500 
x = c(1:250) 
y = x^-.25 * someFactor 

, который я показываю в двойном логарифмическом:

plot(x, y, log="xy") 

Теперь я «узнать» наклон данных, используя линейную модель:

model = lm(log(y) ~ log(x)) 
model 

, который дает:

Call: 
lm(formula = log(y) ~ log(x)) 

Coefficients: 
(Intercept)  log(x) 
     6.215  -0.250 

Теперь я хотел бы построить линейную регрессию в виде красной линии, но abline не работает:

abline(model, col="red") 

Что это самый простой способ добавить линию регрессии на мой сюжет?

ответ

4
lines(log(x), exp(predict(model, newdata=list(x=log(x)))) ,col="red") 

Диапазон значений для x, построенных по логарифмической шкале, и для журнала (x), используемого в качестве независимой переменной, на самом деле совсем иная. Это даст вам полный спектр:

lines(x, exp(predict(model, newdata=list(x=x))) ,col="red") 

enter image description here

+0

я предсказывал только два значения (один близко к нулю, и один очень большой один). Тогда линия не только между наименьшим и наибольшим значением на графике, но выходит за их пределы. –

3

Вместо преобразования осей, участок лог-трансформированных x и y.

plot(log(x), log(y)) 
abline(model, col="red") 
3

Ваша линия является затевается, вы просто не можете увидеть его в окне, поскольку значения сильно отличаются. То, что происходит, когда вы включаете аргумент log='xy', состоит в том, что пространство под графиком (так сказать) искажается (растягивается и/или сжимается), тем не менее, исходные числа все еще используются. (Представьте, что вы нарисовываете эти точки вручную на графической бумаге, вы по-прежнему отмечаете точку, где слабые линии синего графика, например, (1500), пересекаются, но графическая бумага непрерывно растягивается, так что линии неравномерно распределены больше.) С другой стороны, ваша модель использует преобразованные данные.

Вам необходимо сделать свой сюжет с теми же преобразованными данными, что и ваша модель, а затем просто перекрасить свои оси таким образом, чтобы они были достаточно интуитивно доступными. Это первая попытка:

plot(log(x), log(y), axes=FALSE, xlab="X", ylab="Y") 
box() 
axis(side=1,  at=log(c(1,2, 10,20, 100,200)), 
      labels=c( 1,2, 10,20, 100,200)) 
axis(side=2,  at=log(c(125,135, 250,260, 350, 500)), 
      labels=c( 125,135, 250,260, 350, 500)) 
abline(model, col="red") 

enter image description here

+1

Иногда я ненавижу R, ... кажется, нет способа добавить регрессионную линию, не манипулируя исходными данными. Затем мне также нужно миниатюрировать данные для баров ошибок ('errbar') и красиво выглядящих тиков оси (' eaxis'), так как это также не реализовано по умолчанию. –

+0

Я думаю, что это ошибка в R imho – Chris

Смежные вопросы