2012-07-19 38 views
5

Si tengo un conjunto de puntos en R que son lineales Puedo hacer lo siguiente para representar los puntos, ajustar una línea a ellos, a continuación, mostrar la línea:curva logarítmica de montaje en R

x=c(61,610,1037,2074,3050,4087,5002,6100,7015) 
y=c(0.401244, 0.844381, 1.18922, 1.93864, 2.76673, 3.52449, 4.21855, 5.04368, 5.80071) 

plot(x,y)  
Estimate = lm(y ~ x)  
abline(Estimate) 

Ahora, si tengo un conjunto de puntos que se parece a un ajuste de la curva logarítmica es más apropiado como el siguiente:

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)   
y=c(0.974206,1.16716,1.19879,1.28192,1.30739,1.32019,1.35494,1.36941,1.37505) 

sé que puedo conseguir el ajuste de regresión estándar contra el registro de los valores de x con lo siguiente:

logEstimate = lm(y ~ log(x)) 

Pero entonces, ¿cómo transformo ese logEstimate a escala normal y trazo la curva contra mi curva lineal desde antes?

Respuesta

10

Hmmm, no estoy muy seguro de lo que quiere decir con "trazar la curva contra mi curva lineal desde antes".

d <- data.frame(x,y) ## need to use data in a data.frame for predict() 
logEstimate <- lm(y~log(x),data=d) 

Aquí hay tres maneras de obtener los valores previstos:

(1) Uso predict:

plot(x,y) 
xvec <- seq(0,7000,length=101) 
logpred <- predict(logEstimate,newdata=data.frame(x=xvec)) 
lines(xvec,logpred) 

(2) extraer los valores de los coeficientes numéricos:

coef(logEstimate) 
## (Intercept)  log(x) 
## 0.6183839 0.0856404 
curve(0.61838+0.08564*log(x),add=TRUE,col=2) 

(3) Use magia with() (necesita citas entre los nombres de las estimaciones de los parámetros b ebido a que contienen paréntesis)

with(as.list(coef(logEstimate)), 
     curve(`(Intercept)`+`log(x)`*log(x),add=TRUE,col=4)) 

Tal vez lo que desea es

est1 <- predict(lm(y~x,data=d),newdata=data.frame(x=xvec)) 
plot(est1,logpred) 

... aunque no estoy seguro de por qué ...

+0

Muchas gracias. La segunda forma, con la función de curva, es exactamente lo que quería.¿Qué hace exactamente el encuadre de los datos y qué hace? No obtuve mucho de lo que me dijo la función de ayuda(). – user52291

+1

poner los datos en un marco de datos hace que el trabajo futuro con el objeto ajustado (predicciones, etc.) sea más sencillo porque hace que sea más fácil para R ubicar las variables de entrada. 'predic()' predice ... –

8

No estoy exactamente seguro de lo que quiere decir tampoco ... pero adiviné un poco diferente. Creo que quiere ajustar dos modelos a esos puntos, uno lineal y otro registrado. Luego, desea trazar los puntos y la forma funcional de ambos modelos. Aquí está el código para que:

x=c(61,610,1037,2074,3050,4087,5002,6100,7015) 
y=c(0.974206,1.16716,1.19879,1.28192,1.30739,1.32019,1.35494,1.36941,1.37505) 

Estimate = lm(y ~ x) 
logEstimate = lm(y ~ log(x)) 

plot(x,predict(Estimate),type='l',col='blue') 
lines(x,predict(logEstimate),col='red') 
points(x,y) 

enter image description here


En respuesta a la segunda pregunta en el comentario, regresión lineal siempre devuelve una combinación lineal de los predictores, pero eso no significa necesariamente significa que es una línea recta. Piense en lo que su transformación log realmente significa: Si se ajustan,

y = log(x) 

que es el mismo que el ajuste

exp(y) = x 

Lo que significa que a medida que x aumenta de forma lineal, a continuación, y va a cambiar de manera exponencial, lo que es claramente no es una "línea recta". Sin embargo, si transforma su eje x en la escala de registro, entonces la línea mostrada sería recta.

+1

solo ten en cuenta que si quieres una curva logarítmica suave necesitas usar la forma 'newdata' de predicción ... y los resultados serán raros si tus datos no están en aumentando el orden 'x' ... (pero la idea básica es el sonido) –

+0

De acuerdo. Pensé que sería más simple que correcto, pero estás completamente en lo correcto. – nograpes

+0

Gracias. Esto me da lo que quería también (aunque no tan suave como con la función de curva). Estoy un poco confundido porque pensé que siempre regresaría una línea. ¿De qué se trata tu código que hace aparecer una curva y no una línea? – user52291

Cuestiones relacionadas