Cómo obtener la inversa de una interpolación lineal en r -- r camp Relacionados El problema

How to get the inverse of a linear interpolation in R


1
vote

problema

Español

Hice muchas soluciones para ese problema, pero no pudo encontrar un automatizado confiable. Encuentre por debajo de una descripción detallada autopista.

Estos son los datos: data.txt

  SXSSFWorkbook3  

Trazando como una parcela de dispersión:

  SXSSFWorkbook4  

Verás un pico, mi pregunta es ahora: asumiendo que estoy contento con la interpolación lineal, ¿cuál es el ancho al medio máximo de esa "curva"? Entonces, para qué valores x0 de x tengo f (x0) = max (y) / 2, donde f es la interpolación lineal. Lo intenté con aproximación y alguna densidad del kernel, pero no quiero alisar mis datos.

Cualquier entrada es muy bienvenida.

Original en ingles

I went through many solutions for that problem, but could not find a reliable automated one. Please find below a detailed self-suficient description.

These are the data: data.txt

x y 1 1 2 2 3 3 4 2 5 1 

Plotting as a scatter plot:

t=read.table("data.txt",header=T) plot(t$x,t$y,"l") 

You will see a peak, my question is now: assuming I am happy with the linear interpolation, what is the width at half maximum of that "curve"? So for which values x0 of x I have f(x0)=max(y)/2, where f is the linear interpolation. I tried with approxfun and some kernel density, but I do not want to smooth my data.

Any input is very welcome.

  
         
         

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Aquí hay una función simple para hacer lo que desea, asumiendo que sus datos sean unimodales, aquí usando la interpolación lineal:

  # FUNCTION TO INFER FWHM USING LINEAR INTERPOLATION fwhm = function(x, y) {    halfheight = max(y)/2   id.maxy = which.max(y)   y1 = y[1:id.maxy]   y2 = y[id.maxy:length(y)]   x1 = x[1:id.maxy]   x2 = x[id.maxy:length(y)]   x.start = approx(x=y1,y=x1, xout=halfheight, method="linear")$y # or without interpolation: x[which.min(abs(y1-halfheight))]   x.stop = approx(x=y2,y=x2, xout=halfheight, method="linear")$y # or without interpolation: x[which.min(abs(y2-halfheight))+id.maxy]   fwhm = x.stop-x.start   width = fwhm/(2*sqrt(2*log(2)))   return(list(fwhm=fwhm, width=width))   }  # GAUSSIAN PEAK FUNCTION WITH MODE AT u, WIDTH AT INFLECTION POINT w (FWHM=2.355*w) AND PEAK HEIGHT h gauspeak=function(x, u, w, h=1) h*exp(((x-u)^2)/(-2*(w^2)))  # EXAMPLE x = seq(0,200,length.out=1000) y = gauspeak(x=x, u=100, w=10, h=100) fwhm(x=x, y=y) # $`fwhm` # [1] 23.54934 #  # $width # [1] 10.00048   

También puede usar la función # Extend your line for testing y<-c(1,2,3,2,1,2,3,4,5,4,3) # Split into linear segments. segments<-c(1,diff(diff(y)))!=0 seg.points<-which(c(segments,TRUE)) # Calculate desired value val<-max(y)/2 # Loop through and find value res<-c() for(i in 1:(length(seg.points)-1)) { start<-y[seg.points[i]] end<-y[seg.points[i+1]] if ((val>=start & val<=end) | (val<=start & val >=end)) { slope=(end-start)/(seg.points[i+1] - seg.points[i]) res<-c(res,seg.points[i] + ((val - start) / slope)) } } res # [1] 2.5 3.5 6.5 2 en lugar de approx() para realizar la interpolación de spline cúbico en lugar de la interpolación lineal. Y si sus datos fueron poco limitales pero ruidosas, podrían alisar sus datos primero usando smooth.spline() (tal vez en una escala # Extend your line for testing y<-c(1,2,3,2,1,2,3,4,5,4,3) # Split into linear segments. segments<-c(1,diff(diff(y)))!=0 seg.points<-which(c(segments,TRUE)) # Calculate desired value val<-max(y)/2 # Loop through and find value res<-c() for(i in 1:(length(seg.points)-1)) { start<-y[seg.points[i]] end<-y[seg.points[i+1]] if ((val>=start & val<=end) | (val<=start & val >=end)) { slope=(end-start)/(seg.points[i+1] - seg.points[i]) res<-c(res,seg.points[i] + ((val - start) / slope)) } } res # [1] 2.5 3.5 6.5 5 Si sus datos son estrictamente positivos, después de lo cual puede transformarse a la escala original).

 

Here is a simple function to do what you want, assuming your data are unimodal, here using linear interpolation:

# FUNCTION TO INFER FWHM USING LINEAR INTERPOLATION fwhm = function(x, y) {    halfheight = max(y)/2   id.maxy = which.max(y)   y1 = y[1:id.maxy]   y2 = y[id.maxy:length(y)]   x1 = x[1:id.maxy]   x2 = x[id.maxy:length(y)]   x.start = approx(x=y1,y=x1, xout=halfheight, method="linear")$y # or without interpolation: x[which.min(abs(y1-halfheight))]   x.stop = approx(x=y2,y=x2, xout=halfheight, method="linear")$y # or without interpolation: x[which.min(abs(y2-halfheight))+id.maxy]   fwhm = x.stop-x.start   width = fwhm/(2*sqrt(2*log(2)))   return(list(fwhm=fwhm, width=width))   }  # GAUSSIAN PEAK FUNCTION WITH MODE AT u, WIDTH AT INFLECTION POINT w (FWHM=2.355*w) AND PEAK HEIGHT h gauspeak=function(x, u, w, h=1) h*exp(((x-u)^2)/(-2*(w^2)))  # EXAMPLE x = seq(0,200,length.out=1000) y = gauspeak(x=x, u=100, w=10, h=100) fwhm(x=x, y=y) # $`fwhm` # [1] 23.54934 #  # $width # [1] 10.00048 

You could also use the spline() function instead of approx() to do cubic spline interpolation instead of linear interpolation. And if your data were unimodal but noisy you could smooth your data first using smooth.spline() (maybe on a log(y+1E-20) scale if your data are strictly positive, after which you can backtransform to the original scale).

 
 
1
 
vote

Probablemente hay muchas formas mejores de hacer esto, pero aquí hay una solución. Sería más fácil si supiéramos cómo hacía la interpolación en primer lugar.

  # Extend your line for testing y<-c(1,2,3,2,1,2,3,4,5,4,3)  # Split into linear segments. segments<-c(1,diff(diff(y)))!=0 seg.points<-which(c(segments,TRUE))  # Calculate desired value val<-max(y)/2  # Loop through and find value res<-c() for(i in 1:(length(seg.points)-1)) {   start<-y[seg.points[i]]   end<-y[seg.points[i+1]]   if ((val>=start & val<=end) | (val<=start & val >=end)) {     slope=(end-start)/(seg.points[i+1] - seg.points[i])     res<-c(res,seg.points[i] + ((val - start) / slope))   } } res # [1] 2.5 3.5 6.5   
 

There are probably a lot of better ways of doing this, but here is one solution. It would be easier if we knew how you did the interpolation in the first place.

# Extend your line for testing y<-c(1,2,3,2,1,2,3,4,5,4,3)  # Split into linear segments. segments<-c(1,diff(diff(y)))!=0 seg.points<-which(c(segments,TRUE))  # Calculate desired value val<-max(y)/2  # Loop through and find value res<-c() for(i in 1:(length(seg.points)-1)) {   start<-y[seg.points[i]]   end<-y[seg.points[i+1]]   if ((val>=start & val<=end) | (val<=start & val >=end)) {     slope=(end-start)/(seg.points[i+1] - seg.points[i])     res<-c(res,seg.points[i] + ((val - start) / slope))   } } res # [1] 2.5 3.5 6.5 
 
 
   
   

Relacionados problema

4  Mostrar un personaje ASCII  ( Show an ascii character ) 
Quiero mostrar un carácter ASCII de bloque █ (es un código ASCII es 219), ¿Cómo puedo mostrarlo en la terminal? Estoy usando rgui en winxp ...

8  R: Construyendo una herramienta simple de la línea de constancia de la línea de comandos / la ventana de captura Cerrar eventos  ( R building a simple command line plotting tool capturing window close events ) 
Estoy tratando de usar R dentro de un script que actuará como una simple herramienta de parcela de línea de comandos. Es decir. Tubos de usuario en un archivo...

5  Añadiendo múltiples columnas, transformando con varias variables  ( Adding multiple columns transforming with multiple variables ) 
¿Cómo agrego los valores de muchas variables? Si acabo de tener dos variables (columnas), simplemente podría ir: summation.variable <- variable1 + variab...

7  ¿Mejor lenguaje de programación para la enseñanza econométrica? [cerrado]  ( Best programming language for teaching econometrics ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

26  Pensando en vectores con r  ( Thinking in vectors with r ) 
Sé que se debe evitar R funciona de manera más eficiente con vectores y bucle. Estoy teniendo dificultades para enseñarme a escribir el código de esta manera....

191  ¿Cómo usar la función R's Ellipsis al escribir su propia función?  ( How to use rs ellipsis feature when writing your own function ) 
El lenguaje R tiene una característica ingeniosa para definir las funciones que pueden tomar un número variable de argumentos. Por ejemplo, la función data.f...

1  ¿Cómo puedo estimar la forma logarítmica de los puntos de datos usando R?  ( How can i estimate the logarithmic form of data points using r ) 
Tengo puntos de datos que representan una función logarítmica. ¿Hay un enfoque donde pueda estimar la función que describe estos datos utilizando R? graci...

2  RAPORTE DE LA COLUMNA DE LA TABLA R cuando se incluye la cadena vacía  ( R table column order when including the empty string ) 
Tengo una serie de valor que incluyen la cadena vacía niveles (MyData $ Phone_Partner_Products) "" "DONT_KEWNOW" "TUELO_INGERESTING" "Not_Ierestin...

10  Variables de enlace en R DBI  ( Bind variables in r dbi ) 
En el paquete DBI , no busco una instalación para usar variables unidas. Hice un documento (la viñeta original de 2002) que dice sobre las variables vinculad...

12  Deshacerse de las filas con atributos duplicados en r  ( Get rid of rows with duplicate attributes in r ) 
Tengo un gran contorno de datos con columnas tales como: ID, time, OS, IP Cada fila de ese flujo de datos corresponde a una entrada. Dentro de ese prot...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos