File size: 4,108 Bytes
71817ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from scipy.optimize import minimize
import plotly.express as px
from scipy.stats import t
import gradio as gr

class RSM_BoxBehnken:
    # ... (Tu c贸digo de la clase RSM_BoxBehnken se mantiene igual) ...

# Crear un DataFrame a partir de la tabla
data = pd.DataFrame({
    'Exp.': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
    'Glucosa': [-1, 1, -1, 1, -1, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0],
    'Extracto de Levadura': [-1, -1, 1, 1, 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0],
    'Tript贸fano': [0, 0, 0, 0, -1, -1, 1, 1, -1, -1, 1, 1, 0, 0, 0],
    'AIA (ppm)': [166.594, 177.557, 127.261, 147.573, 188.883, 224.527, 190.238, 226.483, 195.550, 149.493, 187.683, 148.621, 278.951, 297.238, 280.896]
})

# Crear una instancia de la clase RSM_BoxBehnken
rsm = RSM_BoxBehnken(data)

# --- Funciones para la interfaz de Gradio ---

def fit_full_model():
    rsm.fit_model()
    return "Modelo completo ajustado. Revisa la consola para ver el resumen."

def fit_simplified_model():
    rsm.fit_simplified_model()
    return "Modelo simplificado ajustado. Revisa la consola para ver el resumen."

def optimize_model(method):
    rsm.optimize(method)
    return (f"Optimizaci贸n realizada con {method}. Revisa la consola para ver los niveles 贸ptimos.\n"
            f"Niveles 贸ptimos (codificados): {rsm.optimal_levels}\n"
            f"Valor m谩ximo de {rsm.y_name}: {-rsm.optimized_results.fun:.4f}")

def generate_plot(fixed_variable, fixed_level_natural):
    fig = rsm.plot_rsm_individual(fixed_variable, fixed_level_natural)
    if fig is not None:
        return fig
    else:
        return "Ajusta el modelo simplificado primero."

# --- Creaci贸n de la interfaz de Gradio ---

with gr.Blocks() as demo:
    gr.Markdown("# An谩lisis de Superficie de Respuesta (RSM) - Dise帽o Box-Behnken")

    with gr.Tab("Ajuste de Modelos"):
        with gr.Row():
            full_model_button = gr.Button("Ajustar Modelo Completo")
            simplified_model_button = gr.Button("Ajustar Modelo Simplificado")
        model_output = gr.Textbox(label="Resultado del Ajuste")

        full_model_button.click(fn=fit_full_model, outputs=model_output)
        simplified_model_button.click(fn=fit_simplified_model, outputs=model_output)

    with gr.Tab("Optimizaci贸n"):
        method_dropdown = gr.Dropdown(
            choices=['Nelder-Mead', 'Powell', 'BFGS'],
            value='Nelder-Mead',
            label="M茅todo de Optimizaci贸n"
        )
        optimize_button = gr.Button("Optimizar")
        optimization_output = gr.Textbox(label="Resultado de la Optimizaci贸n")

        optimize_button.click(fn=optimize_model, inputs=method_dropdown, outputs=optimization_output)

    with gr.Tab("Gr谩ficos de Superficie de Respuesta"):
        with gr.Row():
            fixed_variable_dropdown = gr.Dropdown(
                choices=[rsm.x1_name, rsm.x2_name, rsm.x3_name],
                value=rsm.x1_name,
                label="Variable Fija"
            )
            fixed_level_slider = gr.Slider(
                minimum=min(rsm.get_levels(rsm.x1_name)),
                maximum=max(rsm.get_levels(rsm.x1_name)),
                step=0.01,
                value=rsm.get_levels(rsm.x1_name)[1],
                label="Nivel de Variable Fija (Natural)"
            )
        plot_button = gr.Button("Generar Gr谩fico")
        plot_output = gr.Plot(label="Gr谩fico RSM")

        def update_slider_range(fixed_variable):
            levels = rsm.get_levels(fixed_variable)
            return gr.Slider.update(minimum=min(levels), maximum=max(levels), value=levels[1])

        fixed_variable_dropdown.change(
            fn=update_slider_range,
            inputs=fixed_variable_dropdown,
            outputs=fixed_level_slider
        )
        plot_button.click(
            fn=generate_plot,
            inputs=[fixed_variable_dropdown, fixed_level_slider],
            outputs=plot_output
        )

demo.launch()