Spot Finder, a regression analysis

Spot Finder, a regression analysis

Abstract

My ME/CFS regularly improves during the summer. In a previous study, I found that the improvement correlates with air temperature but not with other environmental parameters. In a simulation of summerish conditions performed in a room, during cold months, by artificially increasing air temperature, infrared radiation, and air humidity, the correlation between my symptoms and air temperature tended to be negative. Here I report on a further study where I consider again environmental parameters from a few locations in the temperate and subtropical regions of both hemispheres and I search for the best regression model between them and my status (n=20). The best regression model, among the ones tested, is Y=\beta_0+\beta_1 t +\beta_2 T^4 where Y is my status (the higher the value, the less the symptoms), t is air temperature (°C) and T is absolute air temperature (K). This regression model approximates the flux of thermic energy between my body and the environment, when indoors, but with two different signs for the coefficients of t and of T^4. I have used then the best regression model to predict the score over the year in several cities. These predictions can be used to find the optimal spot to live in, as a function of the month of the year.

Introduction

My ME/CFS improves during summer, in the period of the year that goes from May/June to the end of September (when I am in Rome, Italy). I don’t know why. In a previous study (Maccallini P. 2022), I analyzed the correlation between my symptoms and several environmental parameters, during three periods covering a total of 190 days: in one, I improved while the season was going toward summer, in another one we were in full-blown summer, and in the third one my functioning declined while summer was fading away. The statistical analysis showed a positive correlation between my functionality score and the temperature of the air and a negative correlation between the score and air density and dry air density (remember that the higher the functionality score, the better I feel). No correlation was found between my functionality score and: relative humidity, absolute humidity, atmospheric pressure, and the concentration of particulate with a diameter below or equal to 2.5 \mu m. In another study, I simulated summerish conditions in a room for five months, during cold months, by means of a heat pump, an infrared lamp, an air moisturizer, and mylar panels (Maccallini P. 2022) and despite an improvement during the experiment, the correlation between my status and air temperature tended to be negative. In the present study, I consider again environmental parameters from a few locations in the temperate and subtropical regions of both hemispheres and I search for the best regression model between them and my status.

Figure 1. The duplets City-Month are reported in the euclidean space Cl, R, T. The points City-Months that have already been classified based on the score I registered for them, are colored green (score of 6), red (score of 4), yellow with a black contour line (score of 5), and yellow with a green contour line (score of 5.5). Black dots are doublets City-Month without a classification. CO = Corrientes, Argentina; AS = Asunción, Paraguay; SM = Santa Maria, Cape Verde. F = February; Ma = March, and so on.

Methods and Results

I have considered a set of 20 points defined by the two coordinates City and Month. To each of them, I have assigned a score, from 4 to 6, based on the degree of severity (the lower the score, the worse the disease) of my symptoms in that particular city, for that specific month. For each point City-Month I have collected the monthly mean air temperature (T), mean cloudiness (Cl), and mean solar radiation (R) (Figure 1). I have considered several models of regression between the score (response variable) and the three explanatory variables T, Cl, and R (Table 1). For each regression model, I have calculated the p values of the estimates of the coefficients, and I have also calculated the p value of the F test, given by

(1) \,\,\,p\,=\,P\left(TS>\frac{R^2 \left(n-r-1\right)}{\left(1-R^2\right)r}\right)

where TS follows an F law of parameters r and n-r-1, with r the number of explanatory variables and n the number of data points. All the calculations and the plots of this article (except for Figure 3) have been performed by two custom scripts (reported at the end), one in Octave, and one in R. For the script in Octave I wrote a subroutine for the F-test. The R script also calculates Spearman’s, and Pearson’s correlation coefficients between the variables, including their p values and the corrections for temperature (Table 2).

Model\beta_0\beta_1\beta_2\beta_3F test
1)\,Y=\beta_0+\beta_1 R +\beta_2 t1.90**0.1100.129*1.98e-4
2)\,Y=\beta_0+\beta_1 Cl +\beta_2 t0.5140.0210.198**2.14e-4
3)\,Y=\beta_0+\beta_1 R +\beta_2 Cl + \beta_3 t0.2080.1360.02700.164*5.78e-4
4)\,Y=\beta_0+\beta_1 R +\beta_2 T^4-5.540.1001.36e-9*1.51e-4
5)\,Y=\beta_0+\beta_1 R +\beta_2 t + \beta_3 T^4-1.49e2*0.131-2.60*2.77e-8*3.58e-5
6)\,Y=\beta_0+\beta_1 T^4-7.38**1.70e-9***2.85e-5
7)\,Y=\beta_0+\beta_1 t +\beta_2 T^4-1.44e2*-2.47*2.69e-8*1.28e-5

Table 1. For each regression model, I have indicated the values of the estimates of the coefficients (with their degree of significance), and the p value of the F test. The meaning of the asterisks is * p < 0.05; ** p<0.001; *** p = 0. T = mean daily absolute temperature; t = meant daily temperature in Celsius, R = mean daily solar radiation; Cl = fraction of the day mainly cloudy.

I have used then the best regression model to predict the score along the year in several cities in the temperate and subtropical regions of both hemispheres (Figure 2). The diagrams have been interpolated by using cubic splines, to make them more smooth. These predictions can be used to find the best spot to live in, as a function of the month of the year.

Figure 2. Prediction for the score by the regression model Y=\beta_0+\beta_1 T^4. RM = Rome; AR = Arona, Tenerife, Spain; RO = Rosario, Argentina; BA = Buenos Aires, Argentina; AS = Asunción, Paraguay; CO = Corrientes, Argentina; SM = Santa Maria, Cape Verde.

Cor. between
Y and
Spearman
(p value)
Pearson
(p value)
Pearson
corrected for t
(p value)
Pearson
corrected for R
(p value)
R0.758
(1.10e-4)
0.706
(0.509e-4)
0.204
(0.401)
Cl-0.511
(0.214e-2)
-0.583
(0.696e-3)
0.182
(0.456)
t
0.875
(4.49e-7)
0.786
(4.04e-5)
0.519
(2.27e-2)
T^40.875
(4.49e-7)
0.794
(2.85e-5)
0.515
(2.43e-2)

Table 2. Correlation coefficients (Spearman and Person) between the variables. Corrected Pearson correlations were also computed, when possible. T = mean daily absolute temperature; t = meant daily temperature in Celsius, R = mean daily solar radiation; Cl = fraction of the day mainly cloudy.

I also used the 198 data points from my previous study (Maccallini P. 2022) to test models 7 and 6 of regression. I considered the mean data on three days for all the variables (Table 3). In this case, model 6 performs better. We still have a good level of significance in the F test, and we still have a negative coefficient for t in model 7. If we use this model to make previsions on the score as a function of the month in various cities, we get Figure 3. Consider that this regression model is based on a scoring system that is slightly lower if compared with the one used for the previous analysis.

Model\beta_0\beta_1\beta_2\beta_3F test
6)\,Y=\beta_0+\beta_1 T^48.19e-15.31e-10***1.54e-6
7)\,Y=\beta_0+\beta_1 t +\beta_2 T^4-4.67e1.-9.09e-1.9.41e-9.2.14e-6

Table 3. For each regression model, I have indicated the values of the estimates of the coefficients (with their degree of significance), and the p value of the F test. The meaning of the asterisks is: . p<01, * p < 0.05; ** p<0.001; *** p = 0. T = mean daily absolute temperature; t = meant daily temperature in Celsius, R = mean daily solar radiation; Cl = fraction of the day mainly cloudy.

Figure 2. Prediction for the score by the regression model 6 of Table 3. RM = Rome; AR = Arona, Tenerife, Spain; RO = Rosario, Argentina; BA = Buenos Aires, Argentina. AS = Asunción, Paraguay; CO = Corrientes, Argentina; SM = Santa Maria, Cape Verde.

Discussion

The best regression model is Y=\beta_0+\beta_1 t +\beta_2 T^4, followed by the model \beta_0+\beta_1 T^4, and model Y=\beta_0+\beta_1 R +\beta_2 t + \beta_3 T^4. These three models have a physical meaning; namely, they express the flux of thermic energy between my body and the environment. The human body must balance the energy exchanged with the environment to maintain thermic homeostasis. The power P exchanged with the environment can be written as

(2) \,\,\,P\,=\,R+CV+CD+E

where R is the power exchange in the form of radiant energy, C is the exchange by conduction, CV is the exchange by convection, and E is the dispersion of power by evaporation. This is a simplification of complex phenomena that should also take into account the exchange of thermic power associated with the passage of atmospheric gas through the respiratory system. The power R can be further specified in the form R\,=\,K_1 R_{sun} + K_2(T_me^4-T_env^4) where K_1 R_{sun} is the power absorbed from the Sun, and the other addend is the radiant power exchanged with the environment, whit K_2 a constant that expresses radiant and geometrical properties of both my body and of the environment. While R_{sun} is radiant power in the form of short wave radiation (wavelength below 3 \mu), the other addend represents radiant power exchanged by bodies at low temperatures with a wavelength above 3 \mu (according to the Stephan-Boltzman law) (R). But what temperature is T_{env}? One first approximation might be the absolute temperature of the air, because in warm months, with the windows open, the objects surrounding us tend to acquire a superficial temperature similar to that of the air. To show that point, I analyzed the power emitted by the soil in Rome, during the year 2020, and the temperature of the air (data from ARPALAZIO). If we indicate J the daily mean power emitted per surface unit by the soil in the hemispace, the Stefan-Boltzmann law states that

(3) \,\,\,J\,=\,a\chi T_s^4

where a is a constant below 1 dependent on the material of the surface of the soil, \chi\,=\,5.6696\cdot10^{-8}\frac{W}{m^2 K^4} is the Stefan-Boltzmann constant, and T_s is the absolute temperature of the soil. If the assertion that the temperature of the soil is about the same as the temperature of the air was correct, the regression for the following linear model should have a very low p value of the F test:

(4) \,\,\,J\,=\,B_0 + B_1(273.15 + t_a)^4

And this is in fact the case, we have the regression in Figure 3, with a p value of the F test below 2.2\cdot 10^{-16}. For further details on these calculations, see (Maccallini P, 2022).

Figure 3. Linear regression between the mean daily irradiance from the Earth and the fourth power of the absolute temperature of the air (daily mean value). Data from ARPA, Rome, 2020. The analysis is described in detail in (Maccallini P, 2022).

As for the exchange of power by conduction and convection, in both cases, they are expressed by a constant multiplied by the difference in temperature between my skin and the air. That said, we can write again eq. 1 as follows:

(5) \,\,\,P\,=\,K_1 R_{sun}+K_2 (T_{skin}^4-T_{air}^4)+K_3 (t_{skin} - t_{air})

were we have removed the term linked to evaporation. In other words, the power exchanged by my body with the environment could be expressed, in first approximation, by the equation

(6) \,\,\,P\,=\,B_0+B_1 R_{sun}+B_2 t_{air} + B_3 T_{air}^4

This is model 5 of Table 1. If we consider the case of a subject who rarely leaves home, we can get rid of R_{sun} and we get model 7, the best model of regression. In a previous article, I showed that the best correlation between my status and several environmental parameters was with air temperature (R), and yet in an experiment where I simulated summer in a room with the use of a heat pump, an infrared lamp, and an air moisturizer, there was no correlation between my status and air temperature (R) (in fact the correlation had a tendency to be negative). From the perspective of this new study, I would explain the previous results as follows: in the first study performed during worm months using environmental parameters we caught the Spearman’s correlation between my status and air temperature which was a reflection of the correlation between my status and the longwave infrared radiation from the environment (proportional to the fourth power of the absolute temperature of the air); in the second study, performed during cold months within a room with artificially heated air, there was no correlation between air temperature and the infrared emission of the environment (which came from a lamp), so we found a correlation that tended to be negative perhaps because when I was feeling worse I raised the temperature of the air. It should be noted though that in models 7 and 5 the coefficient of t is negative, therefore it seems that while the longwave infrared radiation plays a positive role, the temperature of the air does not.

Conclusion

The three best regression models suggest that my improvement is linked to the thermal energy balance of the body: the lower the dispersion of radiant thermic energy, the better I feel. But at the same time, the temperature of the air has a detrimental effect. But other interpretations might be possible: there might be an effect of thermal radiation on my biology that is not linked to thermic homeostasis but instead to some other biological targets. Moreover, there might be other models of regression that I have not considered, that perform better than the ones mentioned.

Scripts

The first script is written in Octave. It calculates the regressions and their F tests (by using a custom subroutine) and it plots Figure 1 and Figure 2. It also writes the data in csv format for the second script (in R), which performs the same statistical analyses and also calculates the p values associated with each coefficient estimate.

% file name = Spot_finder_2
% date of creation = 29/01/2023
%
close all
clear all
#
pkg load statistics % we need this package for the F law
spline = 1 % it is one if we want a cubic spline interpolation for the last plot
#
#-------------------------------------------------------------------------------
# Data
#-------------------------------------------------------------------------------
#
months = ["Je"; "F"; "Mr"; "Ap"; "Ma"; "Jn"; "Jl"; "Au"; "S"; "O"; "N"; "D"];
%
% data of Rome (RM), Italy
%
k=1;
Spot(1,:,k) = [2,3,4.3,5.6,6.8,7.5,7.5,6.5,4.9,3.4,2.2,1.8]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [47,44,44,43,39,25,13,18,32,43,47,46]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [7,8,11,13,18,22,25,25,21,17,12,8]; % Mean air temperature (°C)
Spot(4,:,k) = [3,3,6,8,12,16,18,18,15,12,7,4]; % Min air temperature (°C)
Spot(5,:,k) = [12,13,16,19,23,27,31,31,27,22,17,13]; % Max air temperature (°C)
%
% data of Arona (AR), Tenerife, Spain
%
k=2;
Spot(1,:,k) = [3.9,4.9,6.1,7.2,7.8,8.2,8.0,7.4,6.3,5.1,4.0,3.5]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [32,28,26,24,21,9,2,6,21,34,38,36]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [19,19,19,20,21,22,24,25,25,24,22,20]; % Mean air temperature (°C)
Spot(4,:,k) = [16,16,16,17,18,20,21,22,22,21,19,17]; % Min air temperature (°C)
Spot(5,:,k) = [22,22,23,23,24,26,28,28,28,27,25,23]; % Max air temperature (°C)
%
% data of Rosario (RO), Santa Fe, Argentina
%
k=3;
Spot(1,:,k) = [7.6,6.7,5.6,4.3,3.2,2.7,3.0,3.9,5.1,6.3,7.3,7.7]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [28,28,28,34,45,47,44,40,36,32,30,28]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [25,23,22,18,14,11,10,12,15,18,21,24]; % Mean air temperature (°C)
Spot(4,:,k) = [19,18,17,13,10,7,6,7,9,13,16,18]; % Min air temperature (°C)
Spot(5,:,k) = [30,29,27,23,19,16,16,18,21,24,27,29]; % Max air temperature (°C)
%
% data of Buenos Aires (BA), Argentina
%
k=4;
Spot(1,:,k) = [7.6,6.7,5.5,4.1,3.0,2.5,2.7,3.6,4.8,6.2,7.3,7.8]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [29,31,31,38,48,50,48,45,41,37,33,30]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [24,23,22,18,15,12,11,13,14,17,20,23]; % Mean air temperature (°C)
Spot(4,:,k) = [21,20,19,15,12,9,9,10,11,14,17,19]; % Min air temperature (°C)
Spot(5,:,k) = [28,27,25,21,18,15,14,16,18,21,24,27]; % Max air temperature (°C)
%
% data of Asuncion (AS), Paraguay
%
k=5;
Spot(1,:,k) = [7.0,6.6,6.0,5.0,4.1,3.5,3.8,4.5,5.3,6.1,6.9,7.1]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [45,42,33,31,32,37,35,32,32,38,38,42]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [28,27,26,23,20,18,18,20,21,24,25,27]; % Mean air temperature (°C)
Spot(4,:,k) = [23,23,21,19,16,14,14,15,16,19,21,22]; % Min air temperature (°C)
Spot(5,:,k) = [33,32,31,28,25,23,23,25,27,29,31,32]; % Max air temperature (°C)
%
% data of Corrientes (CO), Argentina
%
k=6;
Spot(1,:,k) = [7.2,6.7,5.9,4.8,3.9,3.4,3.6,4.3,5.3,6.2,7.0,7.3]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [39,35,30,30,33,37,35,33,32,34,34,36,]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [27,26,25,22,18,16,15,17,19,22,24,26]; % Mean air temperature (°C)
Spot(4,:,k) = [22,22,20,17,14,12,11,12,14,17,19,21]; % Min air temperature (°C)
Spot(5,:,k) = [33,32,30,26,23,21,21,23,25,27,29,31]; % Max air temperature (°C)
%
% data of SantaMaria (SM), Capo Verde
%
k=7;
Spot(1,:,k) = [5.0,5.9,6.8,7.3,7.3,7.2,6.7,6.2,5.8,5.6,5.0,4.6]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [42,35,34,33,25,19,36,53,56,48,54,49]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [22,22,22,22,23,24,25,27,27,27,25,23]; % Mean air temperature (°C)
Spot(4,:,k) = [20,19,20,20,21,22,23,25,25,24,23,21]; % Min air temperature (°C)
Spot(5,:,k) = [25,25,25,26,26,27,28,30,30,30,28,26]; % Max air temperature (°C)
%
names = {"RM","AR","RO","BA","AS","CO","SM"};
types = {"-k","--k",":k","-r","--r",":r","-b","--b","-.b",}
%
for i=1:5
  max_measure(i) = max([Spot(i,:,1),Spot(i,:,2),Spot(i,:,3),Spot(i,:,4),Spot(i,:,5),Spot(i,:,6),Spot(i,:,7)])
endfor
%
%-------------------------------------------------------------------------------
% Subroutine for F-test
%-------------------------------------------------------------------------------
%
function [pval,R2,TS] = F_test (M,b,beta)
  r = length(M(1,:))-1; % number of explanatory variables
  n = length(M(:,1)) % number of data points
  R = b-M*beta; % residues
  SSR = 0;
  Sbb = 0;
  for i=1:n
    SSR = SSR + R(i)^2; % sum of squared residues
    Sbb = Sbb + b(i)^2;
  endfor
  Sbb = Sbb - n*(mean(b))^2;
  R2 = (Sbb - SSR)/Sbb; % R squared
  TS = R2*(n-r-1)/(r*(1-R2)); % test statistics
  pval = 1 - fcdf(TS,r,n-r-1); % F-test
endfunction
%
%-------------------------------------------------------------------------------
% Subroutine plot_score
%-------------------------------------------------------------------------------
%
function Plot_score (score, h, model, names, types, spline)
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      if (spline==1)
        yi = interp1([1:1:12],score(:,k),[1:0.25:12],"spline")
        plot([1:0.25:12],yi,char(types{k}),"linewidth",1.5)
        hold on
      else
        plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
        hold on
      endif
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h})
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
endfunction
%
%-------------------------------------------------------------------------------
figure 1 % mean temp, irradiation, cloudiness with storing of data for regressions
%-------------------------------------------------------------------------------
%
% plotting Rome
%
k=1;
n=1;
for i=1:12
  if (and(i>=6,i<9))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (or(i<6,i>9))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
  if (or(and(i>3,i<5),i>9))
    b(n)=4;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i==5)
    b(n)=5;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i==9)
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','g')
    b(n)=5.7;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  hold on
endfor
%
% plotting Arona
%
k=2;
for i=1:12
  if (i==5)
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (and(i>=1,i<5))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
    b(n)=4
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
    hold on
endfor
%
% plotting Rosario
%
k=3;
for i=1:12
  if (and(i>=1,i<3))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i==3)
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','k')
    b(n)=5.5
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  hold on
endfor
%
% plotting CABA
%
k=4;
for i=1:12
  if (or(i==12,i==1,i==2))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i<12)
    hold on
  endif
endfor
%
% plotting query spots
%
% Asuncion
%
k=5;
for i=2:4
  plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Corrientes
%
k=6;
for i=2:4
  plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Santa Maria
%
k=7;
for i=2:5
  plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
grid on
grid minor on
xlabel("Mean daily incident solar radiation (kWh/m^{2})",'fontsize',15);
ylabel("Fraction of the day mainly cloudy (%)",'fontsize',15);
zlabel("Mean air temperature (°C)",'fontsize',15);
axis ('square')
axis([4,max_measure(1),0,max_measure(2),15,max_measure(3)])
%
%-------------------------------------------------------------------------------
% Regressions
%-------------------------------------------------------------------------------
%
n=n-1; % number of measures
%
b = transpose(b)
x = cell() % it contains the coefficients of the models
model = cell() % it contains the description of the models
matrix = cell() % it contains the matrix of the regression
k = 0;
%
for i=1:n
  A(i,1:3)=[1,M(i,2),M(i,4)]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b2*t"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:3)=[1,M(i,3),M(i,4)]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Cl + b2*t"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:4)=[1,M(i,2),M(i,3),M(i,4)]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b1*Cl + b2*t"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:3)=[1,M(i,2),(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b2*T^{4}"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:4)=[1,M(i,2),M(i,4),(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b2*t + b3*T^{4}"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:2)=[1,(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*T^{4}"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:3)=[1,M(i,4),(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*t + b2*T^{4}"
matrix{k} = A;
clear A
%
%-------------------------------------------------------------------------------
% Selection of the best model
%-------------------------------------------------------------------------------
%
for i=1:length(pval)
  if (pval(i)==min(pval))
    best=i;
  endif
endfor
%
%-------------------------------------------------------------------------------
% Region of the plane Rad-Temp with high score according to the regression
% model
%-------------------------------------------------------------------------------
%
R(1)= 4;
R(2)= max_measure(1);
Temp_R(1) = ( 5.5 - x{1}(1) - x{1}(2)*R(1) )/x{1}(3);
Temp_R(2) = ( 5.5 - x{1}(1) - x{1}(2)*R(2) )/x{1}(3);
%
%-------------------------------------------------------------------------------
% Region of the plane Cloudiness-Temp with high score according to the regression
% model
%-------------------------------------------------------------------------------
%
Cl(1)= 0;
Cl(2)= max_measure(2);
Temp_Cl(1) = ( 5.5 - x{2}(1) - x{2}(2)*Cl(1) )/x{2}(3);
Temp_Cl(2) = ( 5.5 - x{2}(1) - x{2}(2)*Cl(2) )/x{2}(3);
%
%-------------------------------------------------------------------------------
figure 2 % mean temp and irradiation
%-------------------------------------------------------------------------------
%
% plotting Rome
%
k=1;
for i=1:12
  if (and(i>=6,i<9))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (or(i<6,i>9))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
  if (i==9)
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','g')
  endif
  hold on
endfor
%
% plotting Arona
%
k=2;
for i=1:12
  if (i==5)
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (and(i>=1,i<5))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
    hold on
endfor
%
% plotting Rosario
%
k=3;
for i=1:12
  if (and(i>=1,i<3))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i==3)
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','k')
  endif
  hold on
endfor
%
% plotting CABA
%
k=4;
for i=1:12
  if (or(i==12,i==1,i==2))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i<12)
    hold on
  endif
endfor
%
% plotting query spots
%
% Asuncion
%
k=5;
for i=2:4
  plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Corrientes
%
k=6;
for i=2:4
  plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Santa Maria
%
k=7;
for i=3:5
  plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
plot([R(1),R(2)],[Temp_R(1),Temp_R(2)],"--k","linewidth",1)
%
grid on
grid minor on
xlabel("Mean daily incident solar radiation (kWh/m^{2})",'fontsize',15);
ylabel("Mean air temperature (°C)",'fontsize',15);
axis([R(1),R(2),15,max_measure(3)])
%
%-------------------------------------------------------------------------------
figure 3 % mean temp and cloudiness
%-------------------------------------------------------------------------------
%
% plotting Rome
%
k=1;
for i=1:12
  if (and(i>=6,i<9))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (or(i<6,i>9))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
  if (i==9)
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','g')
  endif
  hold on
endfor
%
% plotting Arona
%
k=2;
for i=1:12
  if (i==5)
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (and(i>=1,i<5))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
    hold on
endfor
%
% plotting Rosario
%
k=3;
for i=1:12
  if (and(i>=1,i<3))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i==3)
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','k')
  endif
  hold on
endfor
%
% plotting CABA
%
k=4;
for i=1:12
  if (or(i==12,i==1,i==2))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i<12)
    hold on
  endif
endfor
%
% plotting query spots
%
% Buenos Aires
%
i=2;
k=4;
plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
text(Spot(2,i,k),Spot(3,i,k)-0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
%
% Asuncion
%
k=5;
for i=2:4
  plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Corrientes
%
k=6;
for i=2:4
  plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(2,i,k),Spot(3,i,k)-0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Santa Maria
%
k=7;
for i=3:5
  plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
plot([Cl(1),Cl(2)],[Temp_Cl(1),Temp_Cl(2)],"--k","linewidth",1)
%
grid on
grid minor on
xlabel("Fraction of the day mainly cloudy (%)",'fontsize',15);
ylabel("Mean air temperature (°C)",'fontsize',15);
axis([Cl(1),Cl(2),15,max_measure(3)])
%
%-------------------------------------------------------------------------------
% Plotting the scoring for each city according to the best model
%-------------------------------------------------------------------------------
%
switch best
  case 1
    %
    % Scoring for the query spots according to model h
    %
    h=1;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*Spot(3,i,k);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 2
    %
    % Scoring for the query spots according to model h 
    %
    h=2;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(2,i,k)+x{h}(3)*Spot(3,i,k);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 3
    %
    % Scoring for the query spots according to model h
    %
    h=3;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*Spot(2,i,k)+x{h}(4)*Spot(3,i,k);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 4
    %
    % Scoring for the query spots according to model h
    %
    h=4;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*(Spot(3,i,k)^4);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 5
    %
    % Scoring for the query spots according to model h
    %
    h=5;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*Spot(3,i,k)+x{h}(4)*(Spot(3,i,k)^4);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 6
    %
    % Scoring for the query spots according to model h
    %
    h=6;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*((273.15+Spot(3,i,k))^4);
      endfor
    endfor
    %
    Plot_score (score, h, model, names, types, spline)
  case 7
    %
    % Scoring for the query spots according to model h
    %
    h=7;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(3,i,k)+x{h}(3)*((273.15+Spot(3,i,k))^4);
      endfor
    endfor
    %
    Plot_score (score, h, model, names, types, spline)
endswitch
%
%-------------------------------------------------------------------------------
% We save the data for the regressions
%-------------------------------------------------------------------------------
%
save("M.csv","M")
save("Y.csv","b")
# file name: spot_finder
#
# Asunciòn, 9 marzo 2023
#
#-------------------------------------------------------------------------------
# This script performs the linear regressions performed also by the Octave script
# that goes under the same name
#-------------------------------------------------------------------------------
#
library(ppcor) # we need this for the partial correlation analysis
#
#-------------------------------------------------------------------------------
# Data 
#-------------------------------------------------------------------------------
#
Y<-read.csv(file = "Y.csv", header = F, sep =" ", comment.char = "#") # the response variable
Y<-Y[,2]
M<-read.csv(file = "M.csv", header = F, sep =" ", comment.char = "#")
M<-M[,2:5]
colnames(M)<-c("unity","Rad","Cl","meanT")
AT<-273.15+M$meanT # absolute temperature
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x3*t) 
#-------------------------------------------------------------------------------
#
R_t_re<-lm(Y~M$Rad+M$meanT)
summary(R_t_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*Cl + x3*t) 
#-------------------------------------------------------------------------------
#
C_t_re<-lm(Y~M$Cl+M$meanT)
summary(C_t_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x3*Cl + x4*t) 
#-------------------------------------------------------------------------------
#
R_C_t_re<-lm(Y~M$Rad+M$Cl+M$meanT)
summary(R_C_t_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x4*T^4) 
#-------------------------------------------------------------------------------
#

R_T4_re<-lm(Y~M$Rad+I(AT^4))
summary(R_T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x3*t + x4*T^4) 
#-------------------------------------------------------------------------------
#
R_t_T4_re<-lm(Y~M$Rad+M$meanT+I(AT^4))
summary(R_t_T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*T^4) 
#-------------------------------------------------------------------------------
#
T4_re<-lm(Y~I(AT^4))
summary(T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*t + x3T^4) 
#-------------------------------------------------------------------------------
#
t_T4_re<-lm(Y~M$meanT+I(AT^4))
summary(t_T4_re)
#
#-------------------------------------------------------------------------------
# Spearman coefficients and corresponding p values
#-------------------------------------------------------------------------------
#
Spearman_Rad<-cor.test(Y,M$Rad,alternative="two.sided",method="spearman",conf.level=0.95)
Spearman_Rad
Spearman_Cl<-cor.test(Y,M$Cl,alternative="two.sided",method="spearman",conf.level=0.95)
Spearman_Cl
Spearman_meanT<-cor.test(Y,M$meanT,alternative="two.sided",method="spearman",conf.level=0.95)
Spearman_meanT
#
#-------------------------------------------------------------------------------
# Pearson coefficients, corresponding p values, and partial correlations
#-------------------------------------------------------------------------------
#
Ro_Y_R<-cor.test(Y,M$Rad,alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_R
Ro_Y_C<-cor.test(Y,M$Cl,alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_C
Ro_Y_t<-cor.test(Y,M$meanT,alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_t
Ro_Y_T4<-cor.test(Y,I(AT^4),alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_T4
#
Ro_Y_R_t<-pcor.test(Y,M$Rad,M$meanT,method="pearson")
Ro_Y_R_t
Ro_Y_R_T4<-pcor.test(Y,M$Rad,I(AT^4),method="pearson")
Ro_Y_R_T4
Ro_Y_C_t<-pcor.test(Y,M$Cl,M$meanT,method="pearson")
Ro_Y_C_t
Ro_Y_C_T4<-pcor.test(Y,M$Cl,I(AT^4),method="pearson")
Ro_Y_C_T4
Ro_Y_t_R<-pcor.test(Y,M$meanT,M$Rad,method="pearson")
Ro_Y_t_R
Ro_Y_T4_R<-pcor.test(Y,I(AT^4),M$Rad,method="pearson")
Ro_Y_T4_R
Ro_Y_T4_T<-pcor.test(Y,I(AT^4),M$meanT,method="pearson")
Ro_Y_T4_T
#
#-------------------------------------------------------------------------------
# Data of the first environmental study
#-------------------------------------------------------------------------------
#
mydata<-read.csv(file = "correlation.csv", header = T, sep =";")
#
attach(mydata)
n<-length(Station)
Y<-c()
for (i in 1:n) Y[i]<-mean(c(Score1[i], Score2[i], Score3[i]), na.rm = T )
meanT<-Tempmean
meanP<-c()
for (i in 1:n) meanP[i]<-mean(c(Pressuremax[i],Pressuremin[i]), na.rm = T)
meanRH<-RHmean
#
#-------------------------------------------------------------------------------
# mean values
#-------------------------------------------------------------------------------
#
d<-3 # mean on d days
for (i in 1:(n-d)) {
  meanT[i]<-mean(meanT[i:(i+d)], na.rm = T)
  meanP[i]<-mean(meanP[i:(i+d)], na.rm = T)
  meanRH[i]<-mean(meanRH[i:(i+d)], na.rm = T)
  Y[i]<-mean(Y[i:(i+d)], na.rm = T)
}
AT<-273.15+meanT
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*T^4) 
#-------------------------------------------------------------------------------
#
T4_re<-lm(Y~I(AT^4))
summary(T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*t + x3T^4) 
#-------------------------------------------------------------------------------
#
t_T4_re<-lm(Y~meanT+I(AT^4))
summary(t_T4_re)

Advertisement

The current outbreak of Chikungunya in Paraguay

The current outbreak of Chikungunya in Paraguay

After a brief overview of the epidemiology and clinical picture of Chikungunya, I analyze the evolution of the current epidemic in Paraguay.

Introduction

An increase in the cases of Chikungunya (CHIKV) has been registered in Paraguay since October 2022 (40th epidemiological week), with most of the cases localized in the city of Asunción and in the neighboring department of Central (Ministerio de la Salud, CDC). While in the year 2015, a total of 4297 cases were reported in the departments of Asunción and Central, and in 2016 this number was 1239, as of the 3rd of March of 2023 the number of notified cases in these two departments is already about 9000. The magnitude of the current epidemic episode, in comparison with the previous ones, can be fully appreciated by looking at Figure 1, from the Alerta Epidemiológica N° 3/2023 (here).

Figure 1. Weekly cases of Chikungunya in Paraguay from 2015 to the 7th week of 2023, from the Alerta Epidemiológica N° 3/2023, Ministerio de la Salud, Paraguay (here).

Epidemiology of Chikungunya

CHIKV is a disease due to an RNA virus in the alphavirus genus (of the family Togaviridae), transmitted to humans by mosquitos of the genus Aedes. Homo sapiens is the principal reservoir of the pathogen. The disease is endemic in the tropical areas of Africa and Asia, it is characterized in the acute phase by high fever and polyarthralgia. The name comes from a Tanzanian language and it means “to walk bent over”, “to be contorted”, and it alludes to the abnormal gait of the victims, due to joint and muscle pain. In 2013 the disease appeared for the first time in the Caribbean sea (Saint Martin Island) and in the following years it spread in the Americas, from north to south (Yactayo S. et al. 2016).

Figure 2. Weekly cases of Chikungunya in the Dominican Republic from the 8th week of 2014 to the 39th. From Ministerio de Salud Pública, República Dominicana (Pimentel R et al. 2014).

We know from previous outbreaks outside the Americas that the percentage of the population that develops the disease during an epidemic episode (attack rate) goes from 10 to 75% and that those who become infected but are asymptomatic are between 17.5 and 27.8% (Ayu Mas S. et al. 2010). During the outbreak of 2014 in the Dominican Republic the attack rate in the main cities of the nation ranged from 40% to 81%; the epidemic episode lasted from the eighth epidemiological week to the 39th of 2014 (see Figure 2) (Pimentel R et al. 2014). After an epidemic episode in the Italian region of Emilia Romagna (summer of 2007), the attack rate was only 10.2% while the percentage of asymptomatic cases was 18% (Moro ML et al. 2010).

Clinical aspects of Chikungunya

The incubation period is typically 3–7 days (range 1–12 days). The most common clinical findings are acute onset of fever and polyarthralgia. Joint pains are usually bilateral, symmetric, and often severe and debilitating. Other symptoms can include headache, myalgia, arthritis, conjunctivitis, nausea, vomiting, or maculopapular rash. Clinical laboratory findings can include lymphopenia, thrombocytopenia, and elevated creatinine. Rare complications include uveitis, retinitis, myocarditis, hepatitis, nephritis, bullous skin lesions, hemorrhage, meningoencephalitis, myelitis, Guillain-Barré syndrome, and cranial nerve palsies. People at risk for more severe disease include neonates exposed intrapartum, older adults (e.g. age > 65 years), and people with underlying medical conditions (e.g., hypertension, diabetes, or cardiovascular disease). The whole paragraph has been taken from (CDC).

While some patients with the acute disease recover fully, severe and debilitating polyarthralgia may persist and become chronic (duration above 3 months to years). Chronic symptoms were reported in up to 64% of the individuals after one year from the acute phase (Ayu Mas S. et al. 2010). After 2.5 years after the epidemic episode that stroke the Island of Curaçao, in the Caribbean Sea in July 2014, of those who developed the acute phase of the disease only 43% fully recovered: 35% were still mildly affected and 22% were highly affected. Highly affected patients reported the highest prevalence of ongoing rheumatic and non-rheumatic/psychological symptoms, with an increased prevalence of arthralgia in the lower extremities, fatigue, and pain (Doran C et al. 2022). Six years after the epidemic episode of CHIKV of 2005-2006 in Reunion Island (Indian Ocean), a follow-up on 252 military employees (95% males, mean age 44 years) compared those who had CHIKV (81) to those who didn’t (171). CHIK+ patients complained of more frequent and intense joint pain than CHIK- (38% vs. 17% declared suffering at least once a week; 48% vs. 16% declared moderate to intense pain, p 0.0001). The frequency of nonrheumatic symptoms such as fatigue, headache, and depression, was markedly higher among CHIK+ subjects (Marimoutou C et al. 2015). In another follow-up study 18 months after the 2005-2006 outbreak of Reunion, it was found that among 362 adult subjects who had reported either rheumatic pain or fatigue at the onset of the infection, 23.9% developed a CFS-like illness while only 7.4% among initially asymptomatic peers did (p< 0.01) (Duvignaud A et al. 2018).

Figure 3. Weekly cases of Chikungunya in Paraguay from the 40th week of 2022 to the 8th of 2023. From Ministerio de Salud Pública, Paraguay (here).

Analysis of the current Chikungunya epidemic episode in Paraguay

I have considered the latest resumen epidemiologico semanal de arbovirosis (as of the 7th of March 2023) with the weekly reported cases of Chikungunya in the whole national territory (Figure 3). I have searched for a differential equation that could describe the evolution of the cumulative number of cases (f). I considered an exponential model, a logistic one, and a Gaussian model. The mathematical details of the analysis and the script that performs the calculations are reported in the following paragraph. The result of the analysis is reported in Figure 4. The best model (according to both the R^2 and the statistic test specified in Table 1) is the exponential one, followed by the Gaussian one. The Logistic model of growth does not fit well the data. The Gaussian model predicts that the maximum rate of growth will be reached by the mid of April. If we dismiss the first five weeks, focusing on the latest development of the epidemic, the Gaussian model is more optimistic (while the exponential one does not change much, Figure 5) but the statistical parameters indicate a worse fit (Table 2). In this case, the Gaussian model predicts that the maximum rate of growth has been reached by the mid of February.

Figure 4. Cumulative cases of Chikungunya in Paraguay from the 40th week of 2022 to the 8th of 2023. Experimental data from Ministerio de Salud Pública, Paraguay (here). The best model is the exponential one, followed by the Gaussian; the logistic model of growth is clearly not good. The statistical parameters of the regression models are reported in Table 1.

Figure 5. Cumulative cases of Chikungunya in Paraguay from the 45th week of 2022 to the 8th of 2023 (we skip the first five weeks). Experimental data from Ministerio de Salud Pública, Paraguay (here). The statistical parameters of the regression models are reported in Table 2.

ModelTest on the coefficients
(p value)
\bf R^2
Logistic0.01990.2661
Exponential<2\cdot 10^{-16}0.9934
Gaussian1.035\cdot 10^{-12}0.9611

Table 1. Statistical parameters for the regression models. The statistical test on the coefficients is the standard test used for the angular coefficient of the linear regression for the logistic and the exponential model (with H_0:\beta_0=0), while in the case of the Gaussian model, it is an F-test. We consider here the first available data point as the starting point for the regressions.

ModelTest on the coefficients
(p value)
\bf R^2
Logistic0.032510.2868
Exponential7.278\cdot 10^{-15}0.9872
Gaussian5.475\cdot 10^{-9}0.9464

Table 2. As in Table 1, but in this case, we start from the fifth week available.

Further reading (Spanish)

Informe del Ministerio de Salud Publica de Paraguay, 3 marzo 2023 (R).

Comunicado de La Universidad Nacional de Asunción, 3 marzo 2023 (R).

Noticiero de ADN, 8 marzo 2023 (R).

Updates

I will add here the simulations based on the updates by the Ministerio de la Salud of Paraguay. I note that each time there is an update of the page containing the data (this one), not only there is the add of the data of a week, but there is also a substantial change in the cases for all the previous weeks (not sure why this is the case, I assume that notified case must then be verified, so the number will be adjusted over time).

Figure 5.b. Cumulative cases of Chikungunya in Paraguay from the 40th week of 2022 to the 8th of 2023. For the simulation, we use only the last 10 weeks available. Experimental data from Ministerio de Salud Pública, Paraguay (here). F-test: 1.85e-06 (logistic), 1.74e-08 (exponential), 4.312e-07 (gaussian). Update of 10th March 2023.

Figure 5.b.2. Weekly cases of Chikungunya in Paraguay from the 40th week of 2022 to the 8th of 2023. For the simulation, we use only the last 10 weeks available. Experimental data from Ministerio de Salud Pública, Paraguay (here). F-test: 1.85e-06 (logistic), 1.74e-08 (exponential), 4.312e-07 (gaussian). Update of 10th March 2023.

Mathematical notes

The logistic model of growth is described by the differential equation

(1) \frac{df(t)}{dt}\,=\,f(t)\left(r-\frac{r}{k}f(t)\right)

Its solution is given by

(2) f(t)\,=\frac{k}{1+\left(\frac{k}{f_0}-1\right)}e^{-r\left(t-t_0\right)}

We can transform eq.1 into a linear relationship by writing

(3) \frac{\frac{df(t)}{dt}}{f(t)}\,=\,r\,-\,\frac{r}{k}f(t)

We then define the response variable Y\,=\,\frac{\frac{df(t)}{dt}}{f(t)} and the explanatory variable X\,=\,f(t) and we perform a linear regression between them (Figure 6), which gives us the parameters

\beta_0\,=\,r,\,\beta_1\,=\,\frac{r}{k}

From these two relations, we can calculate r and k; by substituting them into eq. 2 we get the logistic curve of Figure 4 and Figure 5.

The exponential model of growth is described by the (1) for k\rightarrow\infty and the solution is

(4) e^{r\left(t\,-\,t_0\right)+\ln(f_0)}

By taking the linear logarithm of both hands of the equation, we have a linear relationship and we can perform a linear regression.

The gaussian model cannot be reduced to a linear model, in general (only when the derivative is smaller than 1). But it can be reduced to a polynomial model of the second order. We consider the differential equation

(5) \frac{df(t)}{dt}\,=\,Ke^{-\frac{1}{2}\left(\frac{t-\mu}{\sigma}\right)^2}

whose solution is

(6) f(t)\,=\,f(t_0)+\sigma K \sqrt{2\pi}\left[\Phi\left(\frac{t-\mu}{\sigma}\right)-\Phi\left(\frac{t_0-\mu}{\sigma}\right)\right]

If we now take the natural logarithm of both hands of the equation, we get a linear relationship:

(7) \ln\left(\frac{df(t)}{dt}\right)\,=\,-\frac{1}{2\sigma^2}t^2+\frac{\mu}{\sigma^2}t-\frac{\mu^2}{2\sigma^2}+\ln (K)

We can now perform a polynomial regression and calculate the unknowns K, \mu, \sigma. Once we know them, we put them into eq. 6 and we have the red curves in Figure 4 and Figure 5. The R script used to perform the regressions and to plot all the figures is reported after the figures.

Figure 6. Linear regression for the logistic model. Starting from the first data point available.

Figure 7. Linear regression for the exponential model. Starting from the first data point available.

Figure 8. Polynomial regression for the gaussian model. Starting from the first data point available.

# file name: chikungunya
#
# Asunciòn, 5 marzo 2023
#
# read the data
#
mydata<-read.csv(file = "Notificaciones Chikungunya.csv", header = T, sep =";")
#
# we define the vector for the cumulative number of cases (updated every week)
#
f<-mydata$CHIKV_not_PY_cum # cases
len<-length(f)
fc<-8 # weeks of forecast
stl<-1 # starting week for logistic regression
ste<-1 # starting week for exponential regression
stg<-1 # starting week for gaussian regression
#
#---------------------------------------------------------
# Logistic growth
#---------------------------------------------------------
#
# we define X (explanatory) and Y (response)
#
st<-stl # starting week
X<-f[st:(len-1)]
n<-length(X)
Y<-c()
for (h in 1:n) {
  i<-st+h-1
  Y[h]<-f[i+1]-f[i]
  Y[h]<-Y[h]/f[i]
}
#
# linear regression
#
Lin_re<-lm(Y~X) 
coefficients<-coef(Lin_re)
B0<-coefficients[[1]]
B1<-coefficients[[2]]
#
# we calculate the residues
#
R<-0
for (i in 1:n) {
  R[i]<-Y[i]-B0-B1*X[i]
}
#
# plotting the linear regression and the residues
#
fitted<-predict(Lin_re) # it contains the line of the regression
#
plot(X, Y, xlab = "f", ylab = "f'/f", pch=21,bg="blue")
abline(lm(Y~X),lwd=1.5, col="black") 
for (i in 1:n) lines (c(X[i],X[i]),c(Y[i], fitted[i]), col="red", lwd=2.5)
grid (col="black",lty="dashed",lwd=1.0)
#
# We calculate and store the logistic curve
#
t<-c(1:(len+fc)) # weeks
r<-B0
k<--r/B1
f2<-c()
t2<-c()
for (h in 1:(n+fc)) {
  i<-st+h-1
  den<-1+(k/f[st]-1)*exp(-r*(t[i]-t[st]))
  f2[h]<-k/den
  t2[h]<-t[i]
}
#
#---------------------------------------------------------
# Exponential growth
#---------------------------------------------------------
#
st<-ste
X<-t[st:(len-1)]
n<-length(X)
Y<-c()
for (h in 1:n) {
  i<-st+h-1
  Y[h]<-log(f[i])
}
#
# linear regression
#
Exp_re<-lm(Y~X) 
coefficients<-coef(Exp_re)
B0<-coefficients[[1]]
B1<-coefficients[[2]]
#
# we calculate the residues
#
R<-0
for (i in 1:n) {
  R[i]<-Y[i]-B0-B1*X[i]
}
#
# plotting the linear regression and the residues
#
fitted<-predict(Exp_re) # it contains the line of the regression
#
plot(X, Y, xlab = "log(cases)", ylab = "weeks", pch=21,bg="blue")
abline(lm(Y~X),lwd=2.5, col="black") 
for (i in 1:n) lines (c(X[i],X[i]),c(Y[i], fitted[i]), col="red", lwd=2.5)
grid (col="black",lty="dashed", lwd=1.5)
#
# We calculate and store the exponential curve
#
t<-c(1:(len+fc)) # weeks
f3<-c()
t3<-c()
for (h in 1:(n+fc)) {
  i<-st+h-1
  f3[h]<-exp(B0+B1*t[i])
  t3[h]<-t[i]
}
#
#---------------------------------------------------------
# Gaussian growth
#---------------------------------------------------------
#
st<-stg # starting week
X<-t[st:(len-1)]
n<-length(X)
Y<-c()
for (h in 1:n) {
  i<-st+h-1
  Y[h]<-log(f[i+1]-f[i])
}
#
# polynomial regression of the second order
#
Gau_re<-lm(Y~X+I(X^2))
coefficients_P<-coef(Gau_re)
B0P<-coefficients_P[[1]]
B1P<-coefficients_P[[2]]
B2P<-coefficients_P[[3]]
#
# we calculate the residues
#
R<-0
for (i in 1:n) {
  R[i]<-Y[i]-B0-B1*X[i]
}
#
# We plot the regression
#
plot(X,Y,pch=21,col="black",bg="red",xlim=c(X[1],X[n]),ylim=c(Y[1],max(Y)),xlab="weeks",ylab="log(f')")
par(new=T)
plot(X,(X^2)*B2P+X*B1P+B0P,type="l",col="red",lty=6,lwd=2,xlim=c(X[1],X[n]),ylim=c(Y[1],max(Y)),xlab="",ylab="")
#
# We calculate and store the logistic curve
#
s<-sqrt(-1/(2*B2P))
mu<-(s^2)*B1P
lnK<-B0P+0.5*(mu/s)^2 
K<-exp(lnK)
t<-c(1:(len+fc)) # weeks
f4<-c()
t4<-c()
for (h in 1:(n+fc)) {
  i<-st+h-1
  mul<-pnorm((t[i]-mu)/s) - pnorm((t[st]-mu)/s)
  f4[h]<-f[st]+s*K*sqrt(2*pi)*mul
  t4[h]<-t[i]
}
#
# We plot the actual data and the logistic fit
#
plot(t[1:len],f,xlab="semanas",ylab="notificaciones",pch=21,bg="blue",xlim=c(1,t[len+fc]),
     ylim=c(0,2*f[len])) # experimental data
par(new=T)
plot(t2,f2,xlab="",ylab="",xlim=c(1,t[len+fc]),ylim=c(0,2*f[len]),type="l",lty=4,lwd=2,col="black") # fitted log
par(new=T)
plot(t3,f3,xlab="",ylab="",xlim=c(1,t[len+fc]),ylim=c(0,2*f[len]),type="l",lty=2,lwd=2,col="black") # fitted exp
par(new=T)
plot(t4,f4,xlab="",ylab="",xlim=c(1,t[len+fc]),ylim=c(0,2*f[len]),type="l",lty=2,lwd=2,col="red") # fitted exp
grid (col="black",lty=1, lwd=1)
abline(v=c(14,18.5,22.5,27),col="black",lty=4,lwd=1.5)
text(x=c(16,20.5,25),y=c(5000,5000,5000),labels = c("Jan","Feb","Mar"))
legend("topleft",legend=c("logistic","exponential","gaussian"),lty=c(2,2,2),col=c("black","black","red"),lwd=c(4,2,2))
summary(Lin_re)
summary(Exp_re)
summary(Gau_re)

La maledizione di Didone

La maledizione di Didone

Aeneis, Liber IV, v 607-621

Sole, tu che illumini i giorni umani,
Giunone, che sai del mio dolore,
Ecate, che tormenti i sonni urbani.

E voi Dire e dèi d'Elissa che muore,
se sventura benevolenza vale,
ascoltatemi. Poiché l'impostore

le ancore getterà al litorale
e questo Giove comanda che accada,
almeno che un nemico eccezionale

incontri, solitario esule vada,
implori aiuto, e veda le morti
amare dei suoi e la vita non goda  

e il trono e il regno a pace iniqua porti.
Ma cada anzitempo e senza sepolcro.
Ciò chiedo con il sangue, per le sue sorti.

Terzine con rime ABA, BCB, …. Di seguito il conteggio delle sillabe, tenendo conto delle sinalefe.

Soletucheilluminiigiorniumani
Giunonechesaidelmiodolore
Ecatechetormentiisonniurbani
evoiDireedéid’Elissachemuore
sesventurabenevolenzavale
ascoltatemipoichél’impostore
leancoregetteallitorale
equestoGiovecomandacheaccada
almenocheunnemicoeccezzionale
incontrisolitarioesulevada
imploriaiutoevedalemorti
amaredeisuoielavitanongoda
eiltronoeilregnoapaceiniquaporti
Macadaanzitempoesenzasepolcro.
Ciòchiedocolsangueperlesuesorti
L'intero quarto libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti. 

Sol, qui terrarum flammis opera omnia lustras;
tuque harum interpres curarum et conscia, Iuno,
nocturnisque Hecate triviis ululata per urbes,
et Dirae ultrices, et di morientis Elisae,
accipite haec: meritumque malis advertite numen, 
et nostras audite preces. Si tangere portus
infandum caput, ac terris adnare necessest:
et si fata Iovis poscunt; hic terminus haeret:
at bello audacis populi vexatus, et armis,
finibus extorris, complexu avulsus Iuli,
auxilium imploret, videatque indigna suorum
funera: nec, cum se sub leges pacis iniquae
tradiderit, regno aut optata luce fruatur:
sed cadat ante diem mediaque inhumatus arena.
Haec precor, hanc vocem extremam cum sanguine fundo.

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Sol, qui flammis opera omnia terrarum lustras;
Sole, che illumini con il fuoco tutte le attività della Terra;
et tu, Iuno, interpres et conscia harum curarum,
e tu, Giunone, intermediaria e complice di questi affanni
et Hecate ululata nocturnis triviis per urbes,
e Ecate, invocata con ululati nei trivi di notte, per le città,
et Dirae ultrices, et di morientis Elisae,
e Dirae vendici, e dèi di Elissa che muore
accipite haec: et advertite malis meritum numen, et nostras audite preces.
accettate queste [parole] e rivolgete alle sventure la meritata benevolenza, e ascoltate le mie preghiere.
Si necessest infandum caput tangere portus ac terris adnare et si fata Iovis poscunt
Se è inevitabile che lo scellerato debba toccare il porto e raggiungere la terra e questo stabilisce il volere di Giove,
hic terminus haeret: at vexatus bello et armis audacis populi,
che così sia: ma almeno sia vessato dalla opposizione armata di un popolo audace,
finibus extorris, avulsus complexu Iuli, auxilium imploret,
sia bandito dal territorio, lontano dall’abbraccio di Iulio, implori aiuto,
videatque indigna suorum funera: nec, cum se tradiderit sub leges iniquae pacis, regno aut optata luce fruatur:
assista alla morte indegna dei suoi, né – sottopostosi a un patto iniquo di pace – goda il regno e la dolce vita:
sed cadat ante diem et inhumatus media arena.
ma cada anzi tempo e resti senza sepoltura sulla spiaggia.
Haec precor, hanc vocem extremam cum sanguine fundo.
Di questo vi supplico; queste ultime parole pronuncio col sangue.

La foto di copertina è un fotogramma dello sceneggiato “Eneide”, diretto da Franco Rossi (1971). Rappresenta Didone, interpretata da Olga Karlatos.

La cognizione del dolore

La cognizione del dolore

1. Una resurrezione

Cosa pensò Michelangelo, in quel giorno di gennaio del 1506, davanti al gruppo del Laocoonte, appena dissotterrato da un campo, sul Colle Oppio? Michelangelo aveva quasi 31 anni: siamo dopo il Bacco, la Pietà e il David; prima della Cappella Sistina, e delle statue originariamente intese per la tomba di Giulio Secondo, e di quelle destinate alle tombe medicee. Per Michelangelo il Laocoonte della seconda metà del primo secolo a.C. dovette rappresentare una visione del proprio futuro, più che un cimelio di un lontanissimo passato.

Il rinvenimento del superbo capolavoro di Hagesander et Polydorus et Athenodorus rhodii, originariamente collocato in Titi imperatoris domo, secondo Plinio il Vecchio (Nat. Hist. XXXVI, 37, Ref), viene ricostruito da Irving Stone, nel suo The Agony and the Ecstasy:

Francesco Sangallo broke into the room, crying, “Father! They’ve unearthed a big marble statue in the old palace of Emperor Titus. His Holiness wants you to go at once and supervise excavating it.” A crowd had already gathered in the vineyard behind Santa Maria Maggiore. In a hollow, the bottom half still submerged, gleamed a magnificent bearded head and a torso of tremendous power. Through one arm, and turning around the opposite shoulder, was a serpent; on either side emerged the heads, arms and shoulders of two youths, encircled by the same serpent. Michelangelo’s mind flashed back to his first night in Lorenzo’s studiolo.
“It is the Laocoön,” Sangallo cried.
“Of which Pliny wrote!” added Michelangelo.

Irving Stone, The Agony and the Ecstasy, Book VII

La fonte qui è una memoria dell’infanzia del Francesco da Sangallo menzionato, figlio di Giuliano, architetto quest’ultimo che a Roma faceva parte, insieme a Michelangelo, di un circolo di artisti fiorentini attratti dalle commissioni papali. E a proprosito della biografia michelangiolesca di Irving Stone: l’autore non è uno storico dell’arte, non è un artista figurativo, non conosce l’italiano e poté usare solo le traduzioni delle fonti (quando disponibili); e non si può dire che sia un Tolstoj. Eppure il suo romanzo del 1961 (all’epoca molto popolare e tradotto anche in un bel film) è un piacevole catalogo delle opere di Michelangelo, contestualizzate, e di molte delle notizie biografiche disponibili all’epoca della stesura.

Non sappiamo cosa deve aver pensato Michelangelo, dicevo. Se davvero il suo San Matteo aveva già l’impostazione definitiva quando lo scultore lo lasciò a Firenze per partire alla volta di Roma nel 1505, egli dovette trovarsi davanti ad una versione compiuta ed estremamente evoluta della sua visione; se invece il San Matteo fu ritoccato in seguito, allora Agesandro, Polidoro e Atenodoro erano con lui, nel suo studio, mentre lavorava sul santo. Quale che sia la cronologia del San Matteo, in ogni caso l’impatto dei tre scultori di Rodi, morti e decoposti da 15 secoli, deve essere stato significativo su Michelangelo, che di certo ha presente il busto del Laocoonte mentre tenta di liberare dal “soverchio” del marmo lo schiavo morente e lo schiavo ribelle (1513).

2. Torsione nell’arte e nella natura

Ma saremmo ingiusti se concludessimo che la successione degli avvitamenti inseguiti da Michelangelo dopo il gennaio del 1506 sia completamente condizionata dal Laocoonte: basta guardare la battaglia dei centauri che Michelangelo scolpisce da adolescente, dove si trova un inventario di tutte le forme che svilupperà nella sua vita, per accorgersi che semplicemente il fiorentino era arrivato alla medesima conclusione dei colleghi di Rodi, indipendentemente; in un’altra vita, in un altro mondo. E a proprosito, una riflessione veloce sulla torsione che ricorre nell’arte. La sintesi della torsione è l’elica, curva che la Natura usa di frequente: si pensi alla elica alpha delle proteine, alla doppia elica del DNA, alla parete cellulare delle spirochete, alla struttura del collagene, ai gusci dei Gastropoda; l’elica e la sua proiezione sul piano ortogonale all’asse, la spirale, ricorre dicevo nell’arte: si trova in Michelangelo, in Giambologna (vedi il ratto della Sabina), in Van Gogh, nelle colonne tortili del Barocco, in alcune statue ellenistiche, nelle scale (vedi la scala di Pierluigi Nervi per lo stadio di Firenze), persino nei campanili (vedi Sant’Ivo alla Sapienza), solo per fare qualche esempio; e conferisce una idea di moto a oggetti che sono fermi. La cosa interessante è che il campo delle velocità di un qualunque corpo rigido congelato in un fotogramma del suo moto è proprio un campo elicoidale. Infatti, la velocità del generico punto P del solido, in un dato istante t, è descritta dalla equazione vettoriale

Eq. 1) \overrightarrow{v_P}(t)\,=\,\overrightarrow{v_O}(t)\,+\,\overrightarrow{\omega}(t)\times\overrightarrow{OP}

dove O è un altro punto del corpo (o dello spazio solidale ad esso) e dove \overrightarrow{\omega} è la velocità angolare (vedi qui, cap IV). Ora, se si prende la curva per P la cui tangenete è \overrightarrow{v_P}(t) e la si prolunga in modo che sia tangente in ogni suo punto al valore del campo delle velocità in quello stesso punto, si ottiene una elica, comunque si scelga P (Figura 1). L’elica cioè descrive proprio la matrice matematica del moto dei corpi nello spazio, oltre ad essere, come visto, una costante nelle forme naturali, microscopiche, nanoscopiche, e macroscopiche. E sebbene queste nozioni di cinematica siano posteriori ai Philosophiae Naturalis Principia Mathematica (1687), gli artisti hanno sempre usato l’elica esattamente per suggerire una idea di moto, senza contare il fatto che l’elica sembra anche inscrivere in sé ulteriori connotazioni emotive e significati. L’elica, che non ha piani di simmetria (sebbene abbia punti di simmetria), è stata usata per animare le forme simmetrche, a un certo punto della storia dell’arte, essendo la simmetria forse il criterio di bellezza originario, quello a cui allude il poeta-pittore William Blake: “What immortal hand or eye could frame thy fearful simmetry?” (The Tyger, 1794).

Figura 1. Due curve tangenti, punto per punto, al medesimo campo vettoriale elicoidale. Il codice che genera questa figura è in appendice (risolve numericamente un sistema di tre equazioni differenziali). Sono indicati anche i versori del campo elicoidale per alcuni dei punti delle curve.

Io stesso tendo ad usare la torsione nelle mie composizioni: in Figura 2, il personaggio di spalle ha la testa che punta verso destra, mentre i suoi piedi si intuisce puntino a sinistra; dunque attraverso la sua lunghezza si realizza una rotazione del piano coronale (o frontale) di quasi 90°.

Figura 2. “You can’t win”, matita su carta, di Paolo Maccallini. Il disegno è ancora incompleto.

3. Creatori di mostri

Il Laocoonte dunque nasce una seconda volta nel 1506. Ma cosa si può dire della sua vera nascita? Tralasciando il dibattito sulla presunta presenza di un originale in bronzo più antico di un secolo, siamo davanti all’intrigante questione del rapporto tra la statua e i versi 201-224 del secondo libro della Eneide, che seguono la medesima narrazione. Virgilio scrisse l’Eneide tra il 29 e il 19 a.C.; il gruppo marmoreo fu prodotto tra il 40 e il 20 dello stesso secolo. Chi ha ispirato chi? Immagino che questa sia una domanda formulata più volte da menti ben più preparate della mia in questo genere di esercizi; io osservo solo che mentre Virgilio preferisce dei mostri (li chiama angues, serpens, dracones) che non hanno una corrispondenza con la zoologia nota (dimensioni a parte, sono serpenti con creste vermiglie: iubaeque sanguineae exsuperant undas), gli autori di Rodi decidono di seguire pedissequamente la natura, usando due pitoni, o qualcosa di molto simile a questo serpente africano, probabilmente non sconosciuto alle culture mediterranee. Riflettendo sulla scelta dei tre scultori, mi sono venute in mente le parole del costruttore di mostri per eccellenza, l’inventore della meccatronica applicata al cinema, Carlo Rambaldi, il quale in un libro del 1987 dice:

Se cerchi di andare al di là della natura e realizzare una cosa assolutamente fantastica, sei libero di fare quello che vuoi; ma se devi imitare la natura – e l’abbiamo sperimentato più volte – conviene guardare la natura.

Leonardo Pellizzari (a cura di), Carlo Rambaldi e gli Effetti Speciali, 1987

Si può dire certo che le creste non sarebbe stato possibile renderle in marmo, ed è vero probabilmente, tuttavia sono convinto che i tre di Rodi abbiano seguito il percorso mentale di Rambaldi; traiettoria che anche io, nei miei tentativi di disegno e nei miei sogni ingegneristici, ho preconizzato. Altrimenti detto: la Natura ha sempre più fantasia degli esseri umani. E la investigazione scientifica non ha fatto che confermarmi questa intuizione.

Segue la mia traduzione, in endecasillabi, dei versi di Virgilio menzionati sopra, e in appendice trovate il computo delle sillabe, i versi originali, la parafrasi in latino e la traduzione letterale.

Assegnato al culto del dio Nettuno
Laocoonte un degno toro offriva.
Ma da Tenedo adesso le calme acque
sovrastano immensi due serpenti
che speculari puntano la costa,
i colli eretti tra i flutti, vermiglie
le creste sopra le onde, immensa mole
del corpo si snoda, e sfiora il mare.
Scroscio di schiuma, e sono sulla riva,
gli occhi iniettati di sangue di fuoco,
lingue vibranti e labbra sibilanti.
Fuggiamo, a Laocoonte aspirano,
ma prima i piccoli corpi dei figli
ambedue i serpenti avvolti stringon
e ingoiano i morsi dei miseri arti.
Poi assalgono il padre accorso in aiuto
armato che nelle spire è legato;
e già su di lui torreggiano, stretto
due volte il busto, per due il collo avvinto. 
Mentre tenta di liberare i nodi,
le vesti pregne di bava letale,
grida disumane lancia alle stelle,
qual mugge il toro che l'altare fugge
scuotendo il collo, la malferma scure.

4. L’antidoto

Il Laocoonte, di marmo o di versi, è dunque la rappresentazione della sofferenza senza luce: una famiglia è spazzata via con una agonia inimmaginabile, quella del cervo mangiato vivo dal predatore, con l’aggravante della consapevolezza della morte. E poi c’è un dolore ancora più grande, inconcepito, innominabile forse: quello della moglie e madre.

Laocoonte, che qualche verso prima tentava di avvisare i troiani sulla pericolosità del cavallo di legno (“timeo Danaos et dona ferentes”), è la voce della ragione davanti al destino oscuro dell’uomo, quello di finire nel gorgo e scomparire; i troiani sono la voce della speranza, che rischia di cadere in trappola (lo vediamo nel fiorire della medicina alternativa per le malattie senza cura e nelle promesse di resurrezione dei vari culti). E’ l’islandese di Leopardi, la voce di Tolstoj in “Confessione”. E’ quello che resta, al netto delle religioni orientali che vennero dopo il mondo pagano, come antidoto. Non è un caso che Stefano Benni posizioni una copia di questa statua nella dimora del suo Achille pié veloce. Eppure nella statua stessa, nel monumento alla cognizione del dolore, c’è un antidoto: la creazione superba, la maestria, il talento strabordante, lo studio minuto della Natura. Il Laocoonte è esso stesso l’antidoto al veleno, sia nel marmo che nei versi. Ed è per questo che menziono nel titolo e nel testo il volume di Gadda: la sua Cognizione del Dolore, con la morte del fratello, la vecchiezza della madre vedova poi uccisa, la follia lucida del figlio che forse assassina la madre (forse no, c’è un indizio nel romanzo), è completamente priva di assoluzione, di resurrezione; se non nel virtuosismo linguistico e nell’analisi della natura umana. Sono opere queste che mostrano l’abisso e allo stesso tempo vi costruiscono sopra un ponte.

Figura 3. Baccio Bandinelli, Laocoonte, 1520-1525, Galleria degli Uffizi. Foto di Paolo Maccallini.

La foto che ho usato in Figura 3 non è del Laocoonte di Agesandro, Polidoro e Atenodoro, lo so. Non si tratta di un errore. La statua degli scultori di Rodi la trovate con la ricerca per immagini su Google, amesso che non sia scolpita nella vostra mente. Questo Laocoonte è la copia di Baccio Bandinelli, un artista che fu costretto dalla committenza e dalle circostanze temporali ad affrontare un gigante sul suo stesso terreno di battaglia: dovette competere con Michelangelo nella statuaria monumentale a tutto tondo, e perse tragicamente. La sua copia del Laocoonte è forse la sua statua più riuscita, se si escludono i bassorilievi per i quali aveva probabilmente più talento. Io ho conosciuto Bandinelli grazie a questa statua, che mi trovai un giorno al fondo della prospettiva di un corridoio degli Uffizi, che arrotolavo come un nastro sotto la mia sedia a rotelle, in una foresta di gambe in passeggio aleatorio.

5. Appendice

Di seguito riporto il conteggio delle sillabe per la mia traduzione, tenendo conto delle sinalefe.

assegnatoalcultodeldioNettuno
Laocoontedegnotorooffriva
madaTenedoadessolecalmeacque
sovrastanoimmensidueserpenti
chespecularipuntanolacosta
icollierettitraifluttivermiglie
lecrestesopraleondeimmensamole
delcorposisnodaesfiorailmare
scrosciodischiumaesonosullariva
gliocchiiniettatidisangueedifuoco
linguevibrantielabbrasibilanti
fuggiamoalaocoonteaspirano
maprimaipiccolicorpideifigli
ambedueiserpentiavvoltistringon
eingoianoimorsideimiseriarti
poiassalgonoilpadreaccorsoinaiuto
armatochenellespireèlegato
egiàsudiluitorreggianostretto
duevolteilbustoperdueilcolloavvinto
mentretentadiliberareinodi
levestipregnedibavaletale
gridadisumanelanciaallestelle
qualmuggeiltorochelaltarefugge
scuotendoilcollolamalfermascure

L’intero secondo libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti.

Laocoon, ductus Neptuno forte sacerdos,
solemnes taurum ingentem mactabat ad aras. 
Ecce autem gemini a Tenedo tranquilla per alta
(horresco referens) immensis orbibus angues
incumbunt pelago, pariterque ad litora tendunt:
pectora quorum inter fluctus arrecta, iubaeque
sanguineae exsuperant undas: pars cetera pontum
pone legit, sinvatque immensa volumine terga.
Fit sonitus spumante salo: iamque arva tenebant,
ardentesque oculos suffecti sanguine, et igni,
sibila lambebant linguis vibrantibus ora.
Diffugimus visu exsangues: illi agmine certo
Laocoonta petunt, et primum parva duorum
corpora natorum serpens amplexus uterque
implicat, et miseros morsu depascitur artus.
Post ipsum auxilio subeuntem ac tela ferentem
corripiunt spirisque ligant ingentibus; et iam
bis medium amplexi, bis collo squamea circum
terga dati, superant capite et cervicibus altis.
Ille simul manibus tendit divellere nodos
perfusus sanie vittas atroque veneno;
clamores simul horrendos ad sidera tollit,
quales mugitus, fugit cum saucius aras
taurus et incertam excussit cervice securim.
At gemini lapsu delubra ad summa dracones
effugiunt, saevaeque petunt Tritonidis arcem,
sub pedibusque deae, clypeique sub orbe teguntur.

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Laocoon, ductus sacerdos Neptuno forte, mactabat ingentem taurum ad aras solemnes.
Laocoonte, nominato sacerdote di Nettuno per sorteggio, uccideva un grande toro presso i solenni altari.
Ecce autem a Tenedo per alta tranquilla [aequora] angues gemini (horresco referens) incumbunt pelago immensis orbibus, pariterque tendunt ad litora:
Ma ecco che da Tenedo, attraverso le acque tranquille, due serpenti gemelli (inorridisco nel raccontarlo) sovrastano il mare con le spire immense, e puntano la riva all’unisono:
pectora quorum arrecta [sunt] inter fluctus, iubaeque sanguineae exsuperant undas: pars cetera legit pontum, pone, sinvatque volumine immensa terga [= terga immenso volumine, ipallage].
i petti dei quali sono eretti sui flutti, e le creste vermiglie si innalzano oltre le onde: il resto del corpo sfiora il mare, dietro, e snoda il dorso in immense spire.
Sonitus fit salo spumante: iamque tenebat arva et, oculos ardentes [acc. di rel.] suffecti sanguine et igni, lambebant sibila ora linguis vibrantibus.
Un gorgoglio è generato dalla mare spumeggiante: già avevano raggiunto la costa e, con occhi ardenti iniettati di sangue e fuoco, lambivano le bocche sibilanto con lingue vibranti.
Diffugimus exangues visu: illi petunt Laocoonta, agmine certo, et primum uterque serpens amplexus implicat parva corpora duorum natorum, et depascitur miseros artus morsu.
Scappiamo con visi esangui: essi puntano Laocoonte, con andatura decisa, e prima i due serpenti stringono, avvolti, i piccoli corpi dei due figli, e divorano i miseri arti a morsi.
Post corripiunt ipsum [Laocoonta], auxilio subeuntem ac tela ferentem, et ligant spiris ingentibus;
Quindi assalgono lo stesso Laocoonte, che accorre in soccorso e porta delle armi, e lo avvincono con le ingenti spire;
et iam amplexi bis medium [acc. di rel.], circumdati [timesi] squamea terga [acc. di rel.] bis collo, superant altis capite et cervicibus.
e stretto due volte il busto [di Laocoonte], due volte avvolte intorno al collo le terga squamose, già torreggiano con il collo e il capo.
Ille simul tendit divellere nodos manibus, vittas perfusus [acc. alla greca] sanie et atro veneno; simul tollit horrendos clamores ad sidera:
Lui, con le bende imbevute di bava e veleno nero, tenta di sciogliere i nodi con le mani mentre leva orrende grida al cielo,
quales mugitus taurus [tollit], cum fugitsaucius aras, et excussit incertam securim cervice.
come i muggiti del toro che fugge ferito dall’altare mentre si squote dal collo la scure malferma.
At gemini dracones effugiunt lapsu ad summa delubra, et petunt arcem saevae Tritonidis, et teguntur sub pedibus deae, et sub orbe clypei.
E i draghi gemelli fuggono strisciando verso gli alti santuari, e si dirigono all’altare della ostile Tritonia [Atena], e si nascondono sotto i piedi della dea, sotto il cerchio dello scudo.

Di seguito il codice in Octave che genera Figura 1, risolvendo numericamente (metodo di Runge-Kutta) il sistema di tre equazioni differenziali ordinarie seguente:

Eq. 2) \begin{cases}\frac{dx(s)}{ds}\,=\,\tau_{x}(s)\\\frac{dy(s)}{ds}\,=\,\tau_{y}(s)\\\frac{dz(s)}{ds}\,=\,\tau_{z}(s)\end{cases}

dove \overrightarrow{\tau} è il versore relativo al campo vettoriale in Eq. 1. Il codice funziona qualunque sia il campo vettoriale inserito nella funzione interna allo script (vectorial_field). Ho scritto questo codice nel 2021, come dimostrazione del metodo di ricostruzione delle fibre di materia bianca nella risonanza magnetica cerebrale con trattografia (Maccallini P. 2021).

% file name = tractography
% date of creation = 05/02/2021
% it plots the trajectory of a fibre, given a vectorial field of diffusion
% eigenvector epsilon_1
clear all
close all
% vectorial field
v = [0,0,3];
w = [0,0,3];
ic = [1.5,1.5,0];
delta_s = 0.5;
function v_f = vectorial_field (x,y,z,v,w)
  v_f = v + cross(w,[x,y,z]);
  v_f = v_f/sqrt(v_f(1)^2+v_f(2)^2+v_f(3)^2);
endfunction
% we set the initial conditions for the first fiber
lambda(1:4,1:3)=0.;
x(1) = ic(1);
y(1) = ic(2);
z(1) = ic(3);
% integration for the first fiber
vector = vectorial_field (x(1),y(1),z(1),v,w);
lambda(1,1) = vector(1);
lambda(1,2) = vector(2);
lambda(1,3) = vector(3);
n = 40;
for i=1:n-1
  for k=2:4
    vector = vectorial_field (x(i)+lambda(k,1)*delta_s/2,y(i)+lambda(k,2)*delta_s/2,z(i)+lambda(k,3)*delta_s/2,v,w);
    lambda(k,1) = vector(1);
    lambda(k,2) = vector(2);
    lambda(k,3) = vector(3);
  endfor
  x(i+1) = x(i)+(lambda(1,1)+2*lambda(2,1)+2*lambda(3,1)+lambda(4,1))*delta_s/6;
  y(i+1) = y(i)+(lambda(1,2)+2*lambda(2,2)+2*lambda(3,2)+lambda(4,2))*delta_s/6;
  z(i+1) = z(i)+(lambda(1,3)+2*lambda(2,3)+2*lambda(3,3)+lambda(4,3))*delta_s/6;
  vector = vectorial_field (x(i+1),y(i+1),z(i+1),v,w);
  quiver3 ( x(i+1),y(i+1),z(i+1),vector(1),vector(2),vector(3),'-k' )
  hold on
endfor
plot3 (x(1:n),y(1:n),z(1:n),'-r','LineWidth',4)
pbaspect ([1, 1, 1])
hold on
% we set the initial conditions for the second fiber
ic = [2.8,2.8,0];
x(1) = ic(1);
y(1) = ic(2);
z(1) = ic(3);
% integration for the second fiber
vector = vectorial_field (x(1),y(1),z(1),v,w);
lambda(1,1) = vector(1);
lambda(1,2) = vector(2);
lambda(1,3) = vector(3);
for i=1:n-1
  for k=2:4
    vector = vectorial_field (x(i)+lambda(k,1)*delta_s/2,y(i)+lambda(k,2)*delta_s/2,z(i)+lambda(k,3)*delta_s/2,v,w);
    lambda(k,1) = vector(1);
    lambda(k,2) = vector(2);
    lambda(k,3) = vector(3);
  endfor
  x(i+1) = x(i)+(lambda(1,1)+2*lambda(2,1)+2*lambda(3,1)+lambda(4,1))*delta_s/6;
  y(i+1) = y(i)+(lambda(1,2)+2*lambda(2,2)+2*lambda(3,2)+lambda(4,2))*delta_s/6;
  z(i+1) = z(i)+(lambda(1,3)+2*lambda(2,3)+2*lambda(3,3)+lambda(4,3))*delta_s/6;
  vector = vectorial_field (x(i+1),y(i+1),z(i+1),v,w);
  quiver3 ( x(i+1),y(i+1),z(i+1),vector(1),vector(2),vector(3),'-k' )
  hold on
endfor
plot3 (x(1:n),y(1:n),z(1:n),'-b','LineWidth',4)
pbaspect ([1, 1, 1])
grid on

Summer simulation, a correlation study

Summer simulation, a correlation study

Abstract

I report here on a successful attempt at reproducing the improvement in my ME/CFS symptoms that I usually experience during summer by means of artificially manipulating the temperature of the air, humidity, and the infrared radiation inside a room I spent five months in, during the period from December to April 2022. I show that the improvement is not correlated with the physical parameters of the air (temperature, relative and absolute humidity, atmospheric pressure, air density, dry air density, saturation vapor pressure, and partial vapor pressure). I hypothesize that it is driven instead by either the mid-wave infrared radiation emitted by a lamp used in the experiment or by the longwave infrared radiation emitted by the walls of the room in which I spent the months of the experiment.

1) Introduction

My ME/CFS improves during summer, in the period of the year that goes from May/June to the end of September (when I am in Rome, Italy). I don’t know why. In a previous study (Maccallini P. 2022), I analyzed the correlation between my symptoms and several environmental parameters, during three periods covering a total of 190 days: in one, I improved while the season was going toward summer, in another one we were in full-blown summer, and in the third one my functioning declined while summer was fading away. The statistical analysis showed a positive correlation between my functionality score and the temperature of the air and a negative correlation between my functionality score and air density and dry air density (remember that the higher the functionality score, the better I feel). No correlation was found between my functionality score and: relative humidity, absolute humidity, atmospheric pressure, and the concentration of particulate with a diameter below or equal to 2.5\,\mu m. While the absence of correlation can be used to rule out causation, the presence of correlation does not mean automatically causation. Moreover, since air density and dry air density are strongly inversely correlated with air temperature, the correlations with air density might be driven by the correlation with air temperature (and vice-versa). In order to further investigate the nature of these correlations, I planned a second study, this time performed inside a chamber where I could manipulate the temperature of the air, the content of water in the air, and the amount of infrared radiation I was hit by. I called this chamber “Summer Simulator” because I used several devices to obtain, during the months from December to May, the conditions that we usually have in Rome during summer. I lived inside the simulator while I collected a functionality score, three times per day, and while I measured (every 10 minutes) the temperature of the air, relative humidity, and atmospheric pressure. The data for the months from January to April were used to study how my symptoms correlated with the environmental parameters I could directly measure and those that I could mathematically derive.

2) Methods

2.1) Data collection

I used a Bresser WiFi 4-in-1 Weather Station (see figure 1) to measure the temperature of the air, pressure, and relative humidity inside the room I spent almost all my time during the experiment. Measures were registered every 10 minutes and sent to the console which uploaded them to my Weathercloud account, via WiFi. The barometer was calibrated by using the closest weather station of the meteorological network of Rome (R). I registered a functionality score three times a day (value from 3 to 7, the higher the better) to use for the search for correlations with environmental data. The data that were employed were those of January, February, March, and April 2022. I also used the daily functionality score collected in 2017, during the same months, for testing the effect of the Summer Simulator on my symptoms.

Figure 1. Bresser 4-in-1 sensor: I used it to measure the temperature of the air, atmospheric pressure, and relative humidity inside the simulator. In the second image, you see the interface of the weather station (left) and a CO2 sensor I used to ensure that the air exchange in the room was adequate.

2.2) Summer Simulator

Simulation of summer was attempted with the following settings. I lived for 5 months in a room of 9\,m^2 . The temperature was controlled by a heat pump (Electrolux EXP26U558HW) that collects air from inside the room, divides it into two fluxes, transfers heat from one to the other (by cycles of compression-evaporation of refrigerant R290), and releases the warmer flux inside and the other one outside the window. The humidity was controlled by two/three ultrasonic mist humidifiers that release mist which is then turned into vapor in a fraction that depends on the temperature of the air (Figure 2).

Figure 2. Ultrasonic mist humidifiers.

To simulate thermal radiation, I used an infrared heater (Turbo TN35E, figure 3) coupled with a chamber with walls covered by mylar, a material that reflects most of the thermal radiation; the chamber was built around the bed, and it had only one side open, to allow for air circulation (figure 4).

Figure 3. Infrared heater, Turbo TN35E.

Figure 4. The infrared chamber with walls made up of mylar, a material that reflects thermal radiation. On the right, you can see the heat pump (white) and the pipeline of the exhausted air, behind the curtain, that leads outside, through a hole in the window.

The infrared heater was, on average, at a distance of 0.8 m from the left side of the bed. It emits most of its power in the mid-wave infrared range (1-4 \mu m).

2.3) Mathematical model for the infrared radiation

I built a mathematical model for the radiation from the lamp (Maccallini P. 2022) which predicts that the power per unit of area of a plane parallel to yz (see figure 4) centered in P\equiv(x_P,\,y_P,\,z_P) is given by

1) W_\bot(x_P, y_P,z_P)\,=\,I_\xi\lg{\frac{\sqrt{(\frac{L}{2}-y_P)^2+x_P^2 +z_P^2 }+\frac{L}{2}-y_P}{\sqrt{(\frac{L}{2}-y_P)^2+x_P^2 +z_P^2 }-(\frac{L}{2}+y_P)}}

where L = 0.53 m is the length of the emitting surface of the lamp on the y axis and where

2) I_\xi\,=\,\frac{e\Pi(1-4b^2)\sqrt{1-4c^2}}{8\pi hLbc[F(\arctan\sqrt{\frac{1-4c^2}{4c^2}},\sqrt{\frac{1-4b^2}{1-4c^2}})-E(\arctan\sqrt{\frac{1-4c^2}{4c^2}},\sqrt{\frac{1-4b^2}{1-4c^2}})]}

In this formula, e is the efficiency of the conversion of electrical power into mid-wave infrared emission (it is 93% according to the manufacturer) while \Pi is the power absorbed by the device (about 800 W, according to the measurements performed by a power meter) and where F and E are the elliptic functions of the first and second kind, respectively (Maccallini P 2013). Parameters b and c (the semi-axes of the ellipsoid in figure 5, in the directions y and z, respectively) depend on how the flux of radiant power is concentrated by the reflector of the lamp. In my model, they are undetermined and must be derived by a minimum of two independent measures of power per unit area. But in the absence of these measures, we can use the values for which we have the absolute minimum for the function I_\xi (b, c) which is reached for b = 0.49, c = 0.36 (assuming c < b < 0.5).

Figure 5. On the left, the systems of coordinates used for building the mathematical model of the infrared heater. On the right, the detail of the ellipsoid that describes the concentration of the radiant power that exits the heater as a result of the power released by the bulb and the power reflected by the reflector behind the bulb; this ellipsoid is represented as a sphere on the left side of this figure. All the details of the model can be found in (Maccallini P. 2022).

The solution of the model (equations 1 and 2) was determined analytically, the values for the elliptic functions were calculated by employing Wolfram Mathematica 5.2 as a function of b and c and saved in a csv file, then the output of the lamp was calculated by a custom script written in Octave (Maccallini P. 2022) that used the output from the Mathematica script. Note that Octave does not have a built-in function for the elliptic functions and a numerical integration by Simpson’s rule led to unsatisfactory results, as detailed in the already mentioned reference. The prediction for a plane parallel to yz at a distance x_P\,=\,0.8\,m from O, is reported in figure 6, where it can be seen that the maximum of W_\bot is reached for P\equiv(0.8,\,0,\,0) and its value is about 376 \frac{W}{m^2}.

Figure 6. The power per unit of area orthogonal to the plane zy (W_\bot), as a function of x_P, y_P, z_P, for x_P\,=\,0.8\,m.

2.4) Derived environmental parameters

The weather station only measured air temperature, atmospheric pressure, and relative humidity, every 10 minutes. The measures were then uploaded via WiFi to a server and downloaded to my computer from my Weathercloud account. To calculate the daily means of these parameters I designed an algorithm that takes into account missing data, as follows: it calculates an hourly mean measure when at least one measure is available for that hour; it fills isolate missing hourly means with the mean between the measure of the hour before and the one of the following hour; it then calculates the daily mean if the hourly means of at least 21 hours are present for each day, otherwise the daily mean is considered as a missing value. From the hourly means of temperature, relative humidity, and pressure, I calculated the hourly means for saturation vapor pressure (SVP), partial vapor pressure (PVP), absolute humidity (AH), dry air density (DAD), and air density (AD), by means of the following formulae:

3) SVP\;=\;6.112e^{\frac{17.62t}{243.12+t}}

4) PVP\,=\,RH\frac{SVP}{100}

5) AH\,=\,100\mu_w\frac{PVP}{R(273.15\,+\,t)}

6) DAD\,=\,100\mu_{dry}\frac{p\,-\,PVP}{R(273.15\,+\,t)}

7) AD\,=\,AH\,+\,DAD

where t, p, RH are air temperature, barometric pressure, and relative humidity, respectively, while \mu_w\,=\,18.015\frac{g}{mol} is the molecular weight of water, \mu_{dry}\,=\,28.97\frac{g}{mol} is the molecular weight of dry air, R\,=\,8.31\frac{J}{K\cdot mol} is the constant of gasses, and where we express temperature in °C and pressure in hPa. These formulae are taken from chapter 4 of the Guide to Instruments and Methods of Observation by the World Meteorological Organization (R) and are derived and discussed in (Maccallini P. 2021). Once obtained the hourly means for the derived environmental measures, the corresponding daily means were computed by using the same method described for t, p, and RH. In figure 8, I reported, as an example, the plots for the environmental parameters (daily means) and the mean daily score for the month of March. All the other plots can be obtained by running the R script reported at the end of this article, in the same folder containing the raw data (that are available, just before the script, for download).

2.5) Statistical analysis

To assess the effect of the summer simulation on my symptoms, I compared the functionality score collected in 2017 (from January to April) with the score collected during the same months of 2022, while living inside the Summer Simulator. The null hypothesis was tested by running the Wilcox test. The correlations between the daily mean score and the environmental parameters were assessed by Spearman’s correlation coefficient and the significance of each correlation was also tested. All the calculations were performed by a custom R script written by myself, available, along with the row data, at the bottom of this page.

3) Results

The comparison between the mean daily scores for the months of January, February, March, and April 2017 and the same parameter for the same months of the year 2022 show that the Summer Simulator has raised the mean daily score in a statistically significant fashion: p value = 1.897\cdot10^{-10}; see figure 7.

Figure 7. Comparison between the mean daily functionality score in 2017 (from January to April), on the right, and the same score in 2022 (same months), while living inside the Summer Simulator, on the left. The difference is statistically significant, reaching a p value of 1.897\cdot10^{-10}. In 2017 I was following a therapy that I judged mildly effective, which allowed me to take the functionality score three times a day during the cold months, which is something that I usually stop doing when I get worse in Autumn, also because the score would always be the lowest one. The diagram is a box and whisker plot, with the indication of the 1st quantile, the median (2nd quantile), and the 3rd quantile.

Figure 8. Daily mean values for each one of the environmental parameters considered in this study and for the functionality score, for the month of March.

The correlations between the mean daily score and the mean daily values of the environmental parameters, and the corresponding p values, are collected in Table 1. After correction for multiple comparisons (Benjamini-Hochberg method), none of the correlations reaches statistical significance.

Parameter
(daily mean)
\rhopp’
Temperature-0.21960.020590.1421
Relative humidity-0.18600.050680.1928
Pressure0.057640.54970.5497
Saturation vapor pressure-0.22140.019550.1421
Partial vapor pressure-0.20810.028420.1421
Absolute humidity-0.20980.027110.1421
Dry air density0.16860.078330.1928
Air density0.15930.096410.1928

Table 1. Correlations between the mean daily functionality score and several environmental parameters (Spearman’s rank correlation coefficient) and the corresponding p values before and after correction for multiple comparisons (Benjamini-Hochberg method).

I run a similar analysis with another method, too: I compared the daily mean temperatures for days with a mean functionality score above 5 and the daily mean temperature for the days with a score below 5, by running the Wilcox test; I repeated this same analysis for all the other environmental parameters (see Table 2 and figure 8).

Figure 8. For each environmental parameter, you find here the comparison between the mean daily value corresponding to days with a mean functionality score above 5, equal to 5, and below 5. Box and whisker plots, with also the indication of the means, as red dots. The p values for the comparisons between days with a mean functionality score below 5 and above 5 are collected in table 2.

Parameterpp
Temperature0.026940.1813
Relative humidity0.1330.2112
Pressure0.21120.2112
Saturation vapor pressure0.025350.1813
Partial vapor pressure0.063240.1897
Absolute humidity0.062130.1897
Dry air density0.030380.1813
Air density0.036250.1813

Table 2. For each environmental parameter, I compared the daily mean value corresponding to days with a functionality score above 5, with the same value for days with a functionality score below 5 (Wilcox test) and I corrected for multiple comparisons (Benjamini-Hochberg method).

4) Discussion

Simulation of summer by raising the air temperature, absolute humidity, and infrared radiation did show to improve my symptoms when I compared my daily functionality score with the score collected for the same period of the year, but in 2017, while I was following another therapy that I judged mildly effective (figure 7). Yet, no correlation reached statistical significance between my functionality score and the environmental parameters that could be measured or derived (temperature, relative and absolute humidity, atmospheric pressure, saturation vapor pressure, partial vapor pressure, dry air density, air density). If we accept that the summer simulation has really improved my condition (i.e. if we rule out a placebo effect), we must admit that the improvement was due to either some combination of the aforementioned parameters or something else. The only other parameter I could exert my control on was infrared radiation by an infrared heater that delivered a power of about 380\,\frac{W}{m^2} on the vertical plane by the left side of my bed, according to a mathematical model of the lamp (figure 6). This radiation was then partially reflected by the surfaces covered in mylar of my infrared chamber, so that it hit my body from other directions too, even though I have not built a model for the whole infrared chamber, yet.

One possible explanation, to my understanding, for the results of this study, is then that the improvement was driven by some effect of the radiation from the lamp, either directly on my body or indirectly to some other parameter of the environment which in turn affected my biology. Importantly, the absence of correlation with air temperature, air density, and dry air density reported by the present study suggests that the significant correlations found in the previous study (Maccallini P. 2022) between my functionality score and the three mentioned parameters were driven by something else that correlates with temperature (which negatively correlates with air density and dry air density). We know that there is an almost linear positive correlation between the temperature of the air and longwave infrared radiation from the Earth into space (Koll DDB and Cronin TW 2018), while the emission of the surface of the Earth within a short distance from it must follow the Stefan-Boltzman law so that it is proportional to T^4, where T is the temperature of the air at the level of the surface, expressed in Kelvin. But it should be noted that while 99% of the power emitted by the Earth as infrared radiation has a wavelength above 5\,\mu m, my infrared heater emits in the range 1-4\,\mu m. So, my artificial source of radiation does not simulate the radiation from the Earth, if we consider the wavelength (while it does from the point of view of the total power, as we will see in a following study, already concluded). But it could be considered that the radiation from the lamp did end up hitting the walls of my room, which in turn released their thermic energy as long wave infrared radiation. It is conceivable then that both in the Summer Simulator and in real summer, my improvements might be driven by far infrared radiation. Another possibility is that the improvement was due to the infrared radiation emitted by my body (long wave infrared radiation) and reflected back to me by the mylar coating of the infrared chamber.

I can’t rule out a placebo effect of the Summer Simulator, even though it showed greater effectiveness than another therapy I was following in 2017, which I considered mildly effective. The difficulty of assessing the effectiveness of a treatment by a subjective score can hardly be overestimated. The identification of objective measures that can be routinely used to score the level of symptoms is of paramount importance for correlation studies like the present one.

5) Conclusions

By simulating summer during the months from January to April of 2022, I experienced an improvement in my symptoms similar to the one I usually experience during summer (although of a lesser magnitude). The simulation was achieved by increasing air temperature and absolute humidity, by using an infrared heater, and by living inside a chamber covered with mylar, a material that reflects most of the thermal radiation, so to avoid dispersion of the radiation from the heater. The improvement does not correlate with any of the parameters of the air (temperature, absolute and relative humidity, saturation vapor pressure, partial vapor pressure, density of the air, density of dry air, atmospheric pressure). One possible explanation for my improvement while living inside the Summer Simulator is that it was due to either the direct radiation from the heater (which is mid-wave infrared radiation) or the radiation from the walls heated by the lamp and the air. The latter radiation is far infrared radiation, the same radiation emitted by the Earth, which linearly correlates with air temperature and which might drive the improvements I experience during summer and the correlation between my functionality score and air temperature reported in a previous study.

6) Funding

This study was supported by those who donated to this website.

7) Supplementary material

The environmental measures and the symptom scores used for this study are available for download:

Score_control_Summer_Simulator.csv

Score_Summer_Simulator.csv

Weathercloud_2022_1.csv

Weathercloud_2022_2.csv

Weathercloud_2022_3.csv

Weathercloud_2022_4.csv

The mathematical model of the infrared heater is available here for download. The script I wrote in R for the statistical analyses is the following one.

# file name: summer_simulator
#
# year: 2022
# month: 08
# day: 31
#
#-------------------------------------------------------------------------------
# We read the measures from Bresser Weather Station
#-------------------------------------------------------------------------------
#
# We set the names of the columns for the data.frames containing environmental data
#
cn<-c("Date","Tempin","Temp","Chill","Dewin","Dew","Heatin","Heat","Humin","Hum",
"Wspdhi","Wspdavg","Wdiravg","Bar", "Rain", "Rainrate","Solarrad","Uvi")
#
# We read the environmental data
#
Jan_2022<-read.csv("Weathercloud Paolo WS 2022-01.csv", sep = ";", col.names = cn, header = T)
Feb_2022<-read.csv("Weathercloud Paolo WS 2022-02.csv", sep = ";", col.names = cn, header = T)
Mar_2022<-read.csv("Weathercloud Paolo WS 2022-03.csv", sep = ";", col.names = cn, header = T)
Apr_2022<-read.csv("Weathercloud Paolo WS 2022-04.csv", sep = ";", col.names = cn, header = T)
List_2022<-list(Jan_2022, Feb_2022, Mar_2022, Apr_2022)
#
# We set some parameters
#
mis<-3 # the highest number of missing hours accepted for a day
muw<-18.01528 # molecular weight of water (g/mol)
mud<-28.97 # molecular weight of dry air (g/mol)
R<-8.31 # universal constant of gasses (J/(K*mole))
month_name<-c("January", "February", "March", "April")
#
#-------------------------------------------------------------------------------
# We work on the score
#-------------------------------------------------------------------------------
#
# We set the names of the columns for the data.frame containing the score
#
cn<-c("Year","Month","Day","score_1","score_2","score_3")
#
# We read the scores
#
Score<-read.csv("Score_Summer_Simulator.csv", sep = ";", col.names = cn, header = T)
Score_control<-read.csv("Score_control_Summer_Simulator.csv", sep = ";", col.names = cn, header = T)
#
attach(Score)
#
ms<-c(rep(0,31*4))
#
# We calculate the daily mean score
#
for (d in 1:length(Year)) {
if (is.na(score_1[d])==F&is.na(score_2[d])==F&is.na(score_3[d])==F) {
ms[d]<-(score_1[d] + score_2[d] + score_3[d])/3
} else ms[d]<-NA
}
#
attach(Score_control)
#
ms_c<-c(rep(0,length(Year)))
#
# We calculate the daily mean score
#
for (d in 1:length(Year)) {
if (is.na(score_1[d])==F&is.na(score_2[d])==F&is.na(score_3[d])==F) {
ms_c[d]<-(score_1[d] + score_2[d] + score_3[d])/3
} else ms[d]<-NA
}
#
# We test the effect of the simulator
#
wilcox.test(ms, ms_c)
boxplot(ms, ms_c, ylab = "score", names = c("summer simulator","other"))
#
#-------------------------------------------------------------------------------
# We calculate mean values for temp (°C), relative humidity (%), and atmospheric
# pressure (hPa)
#-------------------------------------------------------------------------------
#
# We initialize the arrays that will contain the daily means of the environmental
# data
#
t<-c(rep(0,31*4))
rh<-c(rep(0,31*4))
p<-c(rep(0,31*4))
svp<-c(rep(0,31*4))
pvp<-c(rep(0,31*4))
ah<-c(rep(0,31*4))
dad<-c(rep(0,31*4))
ad<-c(rep(0,31*4))
#
#-------------------------------------------------------------------------------
# We work on each month
#-------------------------------------------------------------------------------
#
for (q in 1:4) {
index<-q
add<-31*(q-1)
attach(List_2022[[q]])
#
# We extract the day of the month, the year, the hour from column Date
#
DateR<-read.table(text=Jan_2022[,1], sep ="/")
DateR2<-read.table(text=DateR[,3], sep =" ")
DateR3<-read.table(text=DateR2[,2], sep =":")
#
#-------------------------------------------------------------------------------
#
first_day<-DateR[1,1]
last_day<-DateR[length(DateR[,1]),1]
#
# We calculate the hourly mean for temperature (°C)
#
Temp_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
num<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
for (j in 1:length(DateR[,1])) {
if ( DateR[j,1]==d & DateR3[j,1]== h-1) {
if (is.na(Temp[j])==F) {
Temp_mean[d,h]<-(Temp_mean[d,h] + Temp[j])
num[d,h]<-(num[d,h]+1)
}
}
}
}
}
for (d in first_day:last_day) {
for (h in 1:24) {
if (num[d,h]>0) Temp_mean[d,h]<-Temp_mean[d,h]/num[d,h] else Temp_mean[d,h]<-NA
}
}
#
# We fill isolate missing values
#
for (d in first_day:last_day) {
for (h in 2:23) {
if (is.na(Temp_mean[d,(h-1)])==F&is.na(Temp_mean[d,h])==T&is.na(Temp_mean[d,(h-1)])==F) {
Temp_mean[d,h]<-(Temp_mean[d,(h-1)]+Temp_mean[d,(h+1)])/2
}
}
}
for (d in (first_day+1):(last_day-1)) {
if (is.na(Temp_mean[(d-1),(24)])==F&is.na(Temp_mean[d,1])==T&is.na(Temp_mean[d,2])==F) {
Temp_mean[d,1]<-(Temp_mean[(d-1),24]+Temp_mean[d,2])/2
}
}
#
# We calculate the daily mean for temperature (°C)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(Temp_mean[d,h])==T) count<-count+1
}
if (count<=mis) t[add+d]<-mean(Temp_mean[d,],na.rm = T) else t[add+d]<-NA
}
#
# We calculate the hourly mean relative humidity (%)
#
RH_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
num<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
for (j in 1:length(DateR[,1])) {
if ( DateR[j,1]==d & DateR3[j,1]== h-1) {
if (is.na(Hum[j])==F) {
RH_mean[d,h]<-(RH_mean[d,h] + Hum[j])
num[d,h]<-(num[d,h]+1)
}
}
}
}
}
for (d in first_day:last_day) {
for (h in 1:24) {
if (num[d,h]>0) RH_mean[d,h]<-RH_mean[d,h]/num[d,h] else RH_mean[d,h]<-NA
}
}
#
# We fill isolate missing values
#
for (d in first_day:last_day) {
for (h in 2:23) {
if (is.na(RH_mean[d,(h-1)])==F&is.na(RH_mean[d,h])==T&is.na(RH_mean[d,(h-1)])==F) {
RH_mean[d,h]<-(RH_mean[d,(h-1)]+RH_mean[d,(h+1)])/2
}
}
}
for (d in (first_day+1):(last_day-1)) {
if (is.na(RH_mean[(d-1),(24)])==F&is.na(RH_mean[d,1])==T&is.na(RH_mean[d,2])==F) {
RH_mean[d,1]<-(RH_mean[(d-1),24]+RH_mean[d,2])/2
}
}
#
# We calculate the daily mean relative humidity (%)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(RH_mean[d,h])==T) count<-count+1
}
if (count<=mis) rh[add+d]<-mean(RH_mean[d,],na.rm = T) else rh[add+d]<-NA
}
#
# We calculate the hourly mean pressure (hPa)
#
P_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
num<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
for (j in 1:length(DateR[,1])) {
if ( DateR[j,1]==d & DateR3[j,1]== h-1) {
if (is.na(Hum[j])==F) {
P_mean[d,h]<-(P_mean[d,h] + Bar[j])
num[d,h]<-(num[d,h]+1)
}
}
}
}
}
for (d in first_day:last_day) {
for (h in 1:24) {
if (num[d,h]>0) P_mean[d,h]<-P_mean[d,h]/num[d,h] else P_mean[d,h]<-NA
}
}
#
# We fill isolate missing values
#
for (d in first_day:last_day) {
for (h in 2:23) {
if (is.na(P_mean[d,(h-1)])==F&is.na(P_mean[d,h])==T&is.na(P_mean[d,(h-1)])==F) {
P_mean[d,h]<-(P_mean[d,(h-1)]+P_mean[d,(h+1)])/2
}
}
}
for (d in (first_day+1):(last_day-1)) {
if (is.na(P_mean[(d-1),(24)])==F&is.na(P_mean[d,1])==T&is.na(P_mean[d,2])==F) {
P_mean[d,1]<-(P_mean[(d-1),24]+P_mean[d,2])/2
}
}
#
# We calculate the daily mean pressure (hPa)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(P_mean[d,h])==T) count<-count+1
}
if (count<=mis) p[add+d]<-mean(P_mean[d,],na.rm = T) else p[add+d]<-NA
}
#
# We calculate hourly mean saturation vapor pressure (hPa)
#
Svp_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
if (is.na(Temp_mean[d,h])==F) {
Svp_mean[d,h]<-6.112*exp((17.62*Temp_mean[d,h])/(243.12 + Temp_mean[d,h]))
} else Svp_mean[d,h]<-NA
}
}
#
# We calculate daily mean saturation vapor pressure (hPa)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(Svp_mean[d,h])==T) count<-count+1
}
if (count<=mis) svp[add+d]<-mean(Svp_mean[d,],na.rm = T) else svp[add+d]<-NA
}
#
# We calculate hourly partial vapor pressure (hPa)
#
Pvp_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
if (is.na(Svp_mean[d,h])==F&is.na(RH_mean[d,h])==F) {
Pvp_mean[d,h]<-RH_mean[d,h]*Svp_mean[d,h]/100
} else Pvp_mean[d,h]<-NA
}
}
#
# We calculate daily mean partial vapor pressure (hPa)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(Pvp_mean[d,h])==T) count<-count+1
}
if (count<=mis) pvp[add+d]<-mean(Pvp_mean[d,],na.rm = T) else pvp[add+d]<-NA
}
#
# We calculate hourly absolute humidity (g/m^3)
#
AH_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
if (is.na(Pvp_mean[d,h])==F&is.na(Temp_mean[d,h])==F) {
AH_mean[d,h]<-100*Pvp_mean[d,h]*muw/( R*(273.15 + Temp_mean[d,h]) )
} else AH_mean[d,h]<-NA
}
}
#
# We calculate daily mean absolute humidity (g/m^3)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(AH_mean[d,h])==T) count<-count+1
}
if (count<=mis) ah[add+d]<-mean(AH_mean[d,],na.rm = T) else ah[add+d]<-NA
}
#
# We calculate hourly mean dry air density (g/m^3)
#
DAD_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
if (is.na(Pvp_mean[d,h])==F&is.na(Temp_mean[d,h])==F&is.na(P_mean[d,h])==F) {
DAD_mean[d,h]<-100*(P_mean[d,h]-Pvp_mean[d,h])*mud/( R*(273.15 + Temp_mean[d,h]) )
} else DAD_mean[d,h]<-NA
}
}
#
# We calculate daily mean dry air density (g/m^3)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(DAD_mean[d,h])==T) count<-count+1
}
if (count<=mis) dad[add+d]<-mean(DAD_mean[d,],na.rm = T) else dad[add+d]<-NA
}
#
# We calculate hourly mean air density (g/m^3)
#
AD_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
#
for (d in first_day:last_day) {
for (h in 1:24) {
if (is.na(DAD_mean[d,h])==F&is.na(AH_mean[d,h])==F&is.na(P_mean[d,h])==F) {
AD_mean[d,h]<-AH_mean[d,h] + DAD_mean[d,h]
} else AD_mean[d,h]<-NA
}
}
#
# We calculate daily mean dry air density (g/m^3)
#
for (d in first_day:last_day) {
count<-0
for (h in 1:24) {
if (is.na(AD_mean[d,h])==T) count<-count+1
}
if (count<=mis) ad[add+d]<-mean(AD_mean[d,],na.rm = T) else ad[add+d]<-NA
}
#
# We set as NA the days without measures, building arrays of 31 days
#
for (d in 1:31) if (d<first_day | d>last_day) {
t[add+d]<-NA
rh[add+d]<-NA
p[add+d]<-NA
svp[add+d]<-NA
pvp[add+d]<-NA
ah[add+d]<-NA
dad[add+d]<-NA
ad[add+d]<-NA
}
#
# We plot mean temperature, relative humidity, pressure, saturation vapor pressure
#
plot (c((add+1):(add+31)),t[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "temperature (°C)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),rh[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "relative humidity (%)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),p[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "atmospheric pressure (hPa)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),svp[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "saturation vapor pressure (hPa)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),pvp[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "partial vapor pressure (hPa)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),ah[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "absolute humidity (g/m^3)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),dad[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "dry air density (g/m^3)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
plot (c((add+1):(add+31)),ad[(add+1):(add+31)], type = "b", main =
month_name[index], xlab = "day", ylab = "air density (g/m^3)", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
#
}
#
#-------------------------------------------------------------------------------
# We build a data frame that contains all the data of this study
#-------------------------------------------------------------------------------
#
attach(Score)
mydata<-data.frame(year = Year, month = Month, day = Day,
temperature = t, relative_hum = rh, pres = p, sat_vap_p = svp,
par_vap_p = pvp, absolute_hum = ah, dry_air_d = dad, air_d = ad,
score = ms)
attach(mydata)
#
#-------------------------------------------------------------------------------
# Spearman's correlation ranks
#-------------------------------------------------------------------------------
#
correlations<-list()
correlations[[1]]<-cor.test(score, temperature, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[2]]<-cor.test(score, relative_hum, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[3]]<-cor.test(score, pres, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[4]]<-cor.test(score, sat_vap_p, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[5]]<-cor.test(score, par_vap_p, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[6]]<-cor.test(score, absolute_hum, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[7]]<-cor.test(score, dry_air_d, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[8]]<-cor.test(score, air_d, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[9]]<-cor.test(temperature, air_d, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
correlations[[10]]<-cor.test(temperature, dry_air_d, alternative = "two.sided", method = "spearman",
exact = T, conf.level = 0.95, continuity = T)
#
#-------------------------------------------------------------------------------
# We search for the optimal environmental parameters
#-------------------------------------------------------------------------------
#
low_score<-subset.data.frame(mydata, score<5)
mean_score<-subset.data.frame(mydata, score==5)
high_score<-subset.data.frame(mydata, score>5)
#
# Hypotheses testing
#
# temperature
wilcox.test(low_score[,4], high_score[,4])
# relative humidity
wilcox.test(low_score[,5], high_score[,5])
# atm. pressure
wilcox.test(low_score[,6], high_score[,6])
# saturation vapor pressure
wilcox.test(low_score[,7], high_score[,7])
# partial vapor pressure
wilcox.test(low_score[,8], high_score[,8])
# absolute humidity
wilcox.test(low_score[,9], high_score[,9])
# dry air density
wilcox.test(low_score[,10], high_score[,10])
# air density
wilcox.test(low_score[,11], high_score[,11])
#
# Plotting
#
labels = c("temperature (°C)", "relative humidity (%)", "atm. pressure (hPa)",
"saturation vapor pressure (hPa)", "partial vapor pressure (hPa)",
"absolute humidity (g/m^3)", "dry air density (g/m^3)", "air density (g/m^3)")
for (i in 4:11) {
boxplot(low_score[,i], mean_score[,i], high_score[,i], ylab = labels[i-3], names =
c("score < 5", "score = 5", "score > 5") )
points(1:3, c(mean(low_score[,i], na.rm = T), mean(mean_score[,i], na.rm = T),
mean(high_score[,i], na.rm = T)), col = "red", pch = 18)
grid(col="darkgray")
}
#
#-------------------------------------------------------------------------------
# We plot the mean score for each month
#-------------------------------------------------------------------------------
#
for (i in 1:4) {
score_month<-subset.data.frame(mydata, month == i)
plot (c(1:31),score_month[,12], type = "b", main =
month_name[i], xlab = "day", ylab = "score", pch = 19,
lty = 2, col = "red")
grid(col="darkgray")
}

Seasonal pattern in my symptoms, a correlation study

Seasonal pattern in my symptoms, a correlation study

Abstract

I report here on the correlation between my ME/CFS symptoms and seven environmental parameters. I experience a regular improvement in my condition during the warmer months and I show here that the improvements directly correlate with air temperature and inversely correlate with air density and dry air density. No correlation could be found between my symptoms and relative humidity, absolute humidity, atmospheric pressure, and atmospheric particulate with a diameter \leq 2.5 {\mu}m (PM2.5). The correlation between symptoms and air density and dry air density might be driven by the correlation with temperature because density is strongly inversely correlated with the temperature of the air.

Introduction

My ME/CFS improves during summer, in the period of the year that goes from May/June to the end of September (when I am in Rome, Italy). I don’t know why. We know that ME/CFS tends to have an oscillating course in most patients (Chu L. et al. 2019), but the presence of a seasonal pattern in this patient population has not been investigated so far, to my knowledge. And yet, if you ask directly to patients, some of them say that they feel better in summer. Unfortunately, we don’t have scientific data on that, this is an area worth investigating with some carefully done surveys. I collected a functionality score (the higher, the more I function) for 190 days and I collected seven environmental parameters during these same days; I then calculated Spearman’s rank correlation coefficient between the score and each one of these parameters.

Data collection

I registered a functionality score three times a day (value from 3 to 7, the higher the better) for 199 days. I retrieved four environmental parameters for the same days (if available): mean temperature (T), mean atmospheric pressure (P), mean relative humidity (RH), and mean PM 2.5. While T, P, and RH were collected from Wunderground, PM 2.5 was retrieved from aqicn.

Data were collected during three separate periods, in three separate geographical regions: from March 1st to June 9th, 2021 in Arona (Tenerife, Spain); from February 1st to March 7th, 2020 in Rosario (Santa Fe, Argentina); from September 1st to October 31st, 2020 in Rome (Italy). These three periods were chosen for the following reasons: they are periods in which there is no big difference between the parameters of the air indoors and outdoors; they are periods in which my symptoms had their seasonal switch (I regularly improve during summer, from June to September, when I live in Rome). The closest weather station was used for each period, and when data were missing from one weather station, another one nearby was selected.

Calculation of derived parameters

The PM 2.5 value (particulate matter with a diameter equal to or below 2.5\mu m) was converted from AQI (air quality index) to \mu/m^{3} by solving the following equation with respect to C:

1)  AQI\,=\,\frac{I_{high}\,-\,I_{low}}{C_{high}\,-\,C_{low}}(C\,-\,C_{low})\,+\,I_{low}

Where the intervals I_{low}\,-\,I_{high} and C_{low}\,-\,C_{high} are the ones collected in Table 1 and taken from (Mintz D, 2018). So for example, if we have a value of PM 2.5 of 55 AQI, we select I_{low}\,=\,51\,I_{high}\,=100\,C_{low}\,=12.1\,C_{high}\,=\,35.4 and then we solve Eq. 1 with respect to C to get the corresponding value of PM 2.5 in (\mu/m^{3}).

C_{low}\,-\,C_{high}I_{low}\,-\,I_{high}
0.0–12.0 0–50
12.1–35.4 51–100
35.5–55.4101–150
55.5–150.4 151–200
150.5–250.4 201–300
250.5–350.4301–400
350.5–500.4 401–500
Table 1. Parameters to be used for solving Eq. 1 with respect to C.

Relative humidity is defined as follows

RH\;=\;100\frac{e'}{e'_w}

where {e'} is the partial pressure of water vapor in the air and e'_w is the saturation vapor pressure with respect to water (the vapor pressure in the air in equilibrium with the surface of the water). We then have

e'_w(p,t)\;=\;(1.0016+\frac{3.15}{10^{6}}p-\frac{0.074}{p})6.112e^{\frac{17.62t}{243.12+t}}

Here and in what follows we express pressure in hPa, with hPa\;=\;10^2 Pa, while t is the temperature in °C and T is the temperature in K, with T\;=\;273.15+t. Absolute humidity is simply given by

{\rho}_v\;=\;\frac{m_v}{V}

where m_v is the mass of vapor and V is the total volume occupied by the mixture (Ref, chapter 4). From the law of perfect gasses and considering that, according to Dalton’s law, in moisture, the partial pressure of each gas is the pressure it would have if it occupied the whole volume (Ref), we can also write

e'100\;=\;\frac{m_v}{\mu_{v}}R\frac{273,15 + t}{V}

with R\,=\,8.31\,\frac{J}{K\cdot mole},\,\mu_{v}\,=\,18.02\,\frac{g}{mole}. Then, by substituting e' and m_v in {\rho}_v, we have

2)  AH\,=\,\rho_v\,=\,\frac{6.112RH\mu_{v}}{R(273.15+t)}(1.0016+\frac{3.15}{10^{6}}p-\frac{0.074}{p})e^{\frac{17.62t}{243.12+t}} 

It is also possible to show that the density of dry air (which is due to all the gasses that constitute the air, but water vapor) is given by

3)  DAD\,=\,{\rho}_{dry}\,=\,100\frac{(p\,-\,e')\mu_{dry}}{R(273.15\,+\,t)}

Where we assume \mu_{dry}\,=\,28.97\,\frac{g}{mole}. These calculations are reviewed in more detail in (Maccallini P, 2021). We can then find AD:

4)  AD\,=\,{\rho}_{dry}+{\rho}_{v}

Statistical analysis

The correlation between each environmental parameter and the mean daily score of functionality was measured by the Spearman’s rank correlation coefficient, calculated as:

5)  \rho_{S,Y}\,=\,\frac{Cov(R(S)R(Y)}{\sqrt{Var(R(S))Var(R(Y))}}

where S is the score of functionality and R(S) is its rank, Y is one of the environmental parameters and R(Y) is its rank. The statistical significance for the correlation parameters was calculated by assuming that the null distribution of Spearman’s coefficient is approximated by a symmetric law of the second type, therefore it is possible to show that

6)  t\,=\,\rho_{S,Y}\sqrt{\frac{n-2}{1-\rho_{S,Y}^2}}  

follows a t-student distribution with n – 2 degrees of freedom, where n is the number of measures available for S, Y (the number of days for which we have both S and Y) (Kendall MG, “The Advanced Theory of Statistics”, vol 2, par 31.19), (Maccallini P. 2021). The correction for multiple comparisons was performed according to the Benjamini-Hochberg test. All the calculations and plotting were performed by a custom Octave script (see at the bottom of the article). R was used for the correction for multiple comparisons, by using the following commands:

pval<-c(0.000357, 0.5356, 0.5151, 0.238, 0.00201, 0.00536, 0.1428)
p.adjust(pval, method = "hochberg") 
Parameter
(daily mean)
\rhotpp’
T (°C)0.25633.6373.57\cdot 10^{-4} 0.0025
P (mbar)-0.04522-0.62060.53560.54
RH (%)-0.04752-0.65220.51510.54
AH (g/m^{3})0.085951.1830.2380.54
AD (g/m^{3})-0.223-3.1332.01\cdot 10^{-3} 0.012
DAD (g/m^{3}) -0.2013-2.8175.36\cdot 10^{-3} 0.027
PM2.5 (\mu/m^{3}) -0.1067-1.4720.14280.54

Table 2. Spearman correlation between my daily functionality score and several atmospheric parameters. T: temperature; P: pressure; RH: relative humidity; AH: absolute humidity; AD: air density; DAD: dry air density. P values after correction for multiple comparisons (Benjamini-Hochberg) are collected in the last column.

Results

The Spearman’s correlation coefficients between my score of functionality and each one of the environmental parameters considered are reported in Table 2. The only parameters to show a statistically significant correlation with my symptoms are temperature (T), air density (AD), and dry air density (DAD). While temperature is positively correlated with my score (the higher the temperature, the better I feel), air density and dry air density are inversely correlated (the less the density, the better I feel). The statistical significance of these three correlations survives after correction for multiple comparisons. No correlation was observed between my symptoms and atmospheric pressure, relative humidity (RH), absolute humidity (AH), and the concentration of atmospheric particulate with diameter \leq 2.5 {\mu}m (PM2.5). The distribution of good days (green) and bad days (red) on the plane AH-T and AD-T is reported in Figures 1, and 2. In Figures 3 and 4, it is caught an improvement and its relationship with temperature and air density, respectively. In Figures 5 and 6 a worsening of symptoms can be seen while temperature decreases and air density increases.

Figure 1. The mean daily temperature is on the x-axis while absolute humidity is on the y-axis. Points at the same relative humidity are indicated by the tick black curves. Green dots indicate days with a functionality score above 5; red dots indicate days with a score below 5; blue dots indicate days with a score of 5.

Figure 2. The mean daily temperature is on the x-axis while air density is on the y-axis. Green dots indicate days with a functionality score above 5; red dots indicate days with a score below 5; blue dots indicate days with a score of 5.

Figure 3. Improvement with increasing temperature. Green dots indicate days with a functionality score above 5; red dots indicate days with a score below 5; blue dots indicate days with a score of 5. Vertical dashed lines indicate the end-beginning of months.

Figure 4. Improvement with decreasing air density. Green dots indicate days with a well-being score above 5; red dots indicate days with a score below 5; blue dots indicate days with a score of 5. Vertical dashed lines indicate the end-beginning of months.

Figure 5. Worsening of symptoms with decreasing temperature. Green dots indicate days with a functionality score above 5; red dots indicate days with a score below 5; blue dots indicate days with a score of 5. Vertical dashed lines indicate the end-beginning of months.

Figure 6. Worsening of symptoms with increasing air density. Green dots indicate days with a functionality score above 5; red dots indicate days with a score below 5; blue dots indicate days with a score of 5. Vertical dashed lines indicate the end-beginning of months.

Discussion

The direct correlation between my degree of functionality and air temperature is the strongest (even if the correlation is low) and the most significant. Since air density and dry air density have a strong inverse dependence on temperature (see Eq. 3, 4), it seems likely that the correlation between my symptoms and AD and DAD is driven by the correlation with temperature. A more accurate statistical analysis (multinomial regression) might elucidate this point. Yet, further experiments (not shown here) have shown that increasing air temperature is not able to induce, by itself, an improvement in my symptoms, so this correlation might very well not indicate causation. On the other hand, a more complex experimental setting has allowed inducing, during winter, the improvement of symptoms that I would normally experience during summer. So I am currently designing better experiments in order to define the combination of parameters that are responsible for the seasonal pattern of my disease. The observation that the significant correlations here reported have very low coefficients is perhaps due to the fact that my score of functionality is particularly flat, and does not depict accurately the range of variability of my symptoms.

Notes

We calculated the daily mean absolute humidity by substituting in Eq. 2 the daily mean values for temperature, relative humidity, and pressure. In general, given a function x = x(t) and a function y = y(x), it is not true that the mean over t of y is given by y(mean of x over t), as it is easy to verify. But in our case, there is no big difference between the daily mean absolute humidity calculated by using Eq. 2 with daily mean values of T, P, and RH and the daily mean calculated from data taken every half an hour, as I verified for Rome, 2019 (see Figure 7). The same is true for air density (Figure 8). For further details see (Maccallini P. 2021)

Figure 7. Absolute humidity as a function of the day of the year for the year 2019, for the city of Rome (2019). The black line is the mean daily value calculated from measures of T, P, and RH taken every half an hour. The blue one is the value calculated from the mean daily values of T, P, and RH.

Figure 8. Air density as a function of the day of the year for the year 2019, for the city of Rome (2019). Black line: the daily mean of the values calculated from the actual measures for T, P, and RH. Blue line: the value calculated by using the daily means for T, P, and RH.

Supplementary material

The environmental measures and the symptom scores used for this study are available for download:

The script

Note: this script is pretty long for the following reasons: Octave is less concise than R in IO-related instructions; it plots and calculates more output than what is shown above; I calculate the p values without using a built-in function for that (I tend to avoid built-in functions, but I am now changing my mind).

% file name = Correlation
% date of creation = 08/11/2021
%-------------------------------------------------------------------------------
% It uses file correlation.xlsx
%-------------------------------------------------------------------------------
clear all
close all
pkg load io
missing = 999999999; % missing measure
%-------------------------------------------------------------------------------
% Physical parameters
%-------------------------------------------------------------------------------
R = 8.31; % constant for ideal gasses (J/K*mole)
mu_v = 18.01528; % molecular weight of water (g/mole)
mu_d = 28.97; % molecular weight of dry air (g/mole)
mu_N2 = 28.013; % molecular weight of N2 (g/mole)
mu_O2 = 31.999; % molecular weight of O2 (g/mole)
mu_CO2 = 44.010; % molecular weight of CO2 (g/mole)
mf_N2 = 0.78084; % molar fraction of N2
mf_O2 = 0.20946 % molar fraction of O2
mf_CO2 = 0.00039445 % molar fraction of CO2
%-------------------------------------------------------------------------------
% We read the name of the sheet and its number of lines directly from the .xlsx file
%-------------------------------------------------------------------------------
file_name = 'Correlation.xlsx';
[filetype, sh_names, fformat, nmranges] = xlsfinfo (file_name);
sheet = char(sh_names(1,1)); % name of the first sheet
n_str = substr(char(sh_names(1,2)),5) % number of lines as string
n_num = str2num(n_str) % number of lines as number
%-------------------------------------------------------------------------------
% We read column F (mean daily temperature, Celsius)
%-------------------------------------------------------------------------------
range = strcat('F2:F',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
t = num;
%-------------------------------------------------------------------------------
% We read column I (mean daily relative humidity, percentage)
%-------------------------------------------------------------------------------
range = strcat('I2:I',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
RH = num;
%-------------------------------------------------------------------------------
% We read column K (max daily pressure, mbar)
%-------------------------------------------------------------------------------
range = strcat('K2:K',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
pmax = num;
%-------------------------------------------------------------------------------
% We read column L (min daily pressure, mbar)
%-------------------------------------------------------------------------------
range = strcat('L2:L',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
pmin = num;
%-------------------------------------------------------------------------------
% We read column M, N, O (score 1, 2, 3 respectively)
%-------------------------------------------------------------------------------
range = strcat('M2:M',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
score1 = num;
range = strcat('N2:N',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
score2 = num;
range = strcat('O2:O',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
score3 = num;
%-------------------------------------------------------------------------------
% We read column P (min daily PM 2.5, AQI)
%-------------------------------------------------------------------------------
range = strcat('P2:P',n_str)
[num,tex,raw,limits] = xlsread (file_name, sheet, range);
pm25 = num;
%-------------------------------------------------------------------------------
% We calculate mean daily pressure, absolute humidity, air density
%-------------------------------------------------------------------------------
for i = 1:n_num-1
if ( t(i)!= missing )
p(i) = ( pmin(i) + pmax(i) )/2;
score(i) = ( score1(i) + score2(i) + score3(i) )/3;
AH(i) = 1000*(mu_v/1000)*(RH(i)/(R*(273.15+t(i))))*(1.0016+3.15*10^(-6)*p(i)-0.074/p(i))*6.112*e^(17.62*t(i)/(243.12+t(i)));
ep (i) = (RH(i)/100)*(1.0016+3.15*10^(-6)*p(i)-0.074/p(i))*6.112*e^(17.62*t(i)/(243.12+t(i)));
AD_dry (i) = 1000*100*(p(i) - ep(i))*(mu_d/1000)/(R*(273.15+t(i)));
AD (i) = AH(i) + AD_dry (i);
N2D(i) = 1000*100*(p(i) - ep(i))*mf_N2*(mu_N2/1000)/(R*(273.15+t(i)));
O2D(i) = 1000*100*(p(i) - ep(i))*mf_O2*(mu_O2/1000)/(R*(273.15+t(i)));
CO2D(i) = 1000*100*(p(i) - ep(i))*mf_CO2*(mu_CO2/1000)/(R*(273.15+t(i)));
else
p(i) = missing;
score(i) = missing;
AH(i) = missing;
AD_dry(i) = missing;
AD (i) = missing;
N2D(i) = missing;
O2D(i) = missing;
CO2D(i) = missing;
endif
endfor
%-------------------------------------------------------------------------------
% We put all these arrays into a single array: this will help us to write a more
% compact script
%-------------------------------------------------------------------------------
k = 1;
for i = 1:n_num-1
if ( t(i)!= missing )
array(1,k) = t(i);
array(2,k) = p(i);
array(3,k) = pmin(i);
array(4,k) = pmax(i);
array(5,k) = RH(i);
array(6,k) = AH(i);
array(7,k) = AD(i);
array(8,k) = N2D(i);
array(9,k) = O2D(i);
array(10,k) = CO2D(i);
array(11,k) = score(i);
k = k+1;
endif
endfor
dim = size(array);
n = k - 1;
k = 1;
for i = 1:n_num-1
if ( pm25(i)!= missing )
array2(1,k) = score(i);
array2(2,k) = pm25(i);
k = k+1;
endif
endfor
m = k - 1;
%clear p score AD N2D O2D CO2D pm25 % we free some memory
%-------------------------------------------------------------------------------
% We calculate mean daily PM 2.5 density (microg/m^3) from daily PM 2.5 AQI
%-------------------------------------------------------------------------------
CLH = [0, 12, 12.1, 35.4, 35.5, 55.4, 55.5, 150.4, 150.5, 250.4, 250.5, 350.4, 350.5, 500.4];
ILH = [0, 50, 51, 100, 101, 150, 151, 200, 201, 300, 301, 400, 401, 500];
for k=1:m % k defines the day
for i=1:5005 % i defines the mass
mass = (i-1)/10;
for j=1:13 % j defines the index
if ( and(mass>=CLH(j),mass<=CLH(j+1) ) )
Itemp = ( ( ( ILH(j+1) - ILH(j) )/( CLH(j+1) - CLH(j) ) )*( mass - CLH(j) ) ) + ILH(j);
endif
endfor
if (abs(Itemp - array2(2,k))<=1)
array2(3,k) = mass;
endif
endfor
endfor
%-------------------------------------------------------------------------------
% We Compute Spearman’s rank correlation coefficient rho between each mean daily
% athmosferic parameter and the mean daily score for the same day. In order to do
% that, we need to create arrays without the days with missing measures. tvalue
% has a student's t-distribution with n-2 degrees of freedom (see par 31.19 of Kendall Vol. 2)
% We Compute also the coefficients a and b of the regression line
%-------------------------------------------------------------------------------
x = array(dim(1),1:n);
for h = 1:dim(1)-1
y = array(h,1:n);
rho(h) = spearman (x, y);
tvalue(h) = rho(h)*sqrt( (n - 2)/(1 - rho(h)^2) );
a(h) = cov(x,y)/var(x);
b(h) = mean(y) - a(h)*mean(x);
endfor
clear x
x = array2(1,1:m);
for h = dim(1):dim(1)+1
y = array2(h-dim(1)+2,1:m);
rho(h) = spearman (x, y);
tvalue(h) = rho(h)*sqrt( (n - 2)/(1 - rho(h)^2) );
a(h) = cov(x,y)/var(x);
b(h) = mean(y) - a(h)*mean(x);
endfor
%-------------------------------------------------------------------------------
% We Compute the p value (two-tailed) related to each rho
%-------------------------------------------------------------------------------
ni = n - 2; % degrees of freedom of t-distribution
for h = 1:dim(1)+1
s(h) = ni/(tvalue(h)^2 + ni); % betainc computes B(x,a,b)/B(a,b)
pval(h) = 2*( 0.5*betainc(s(h), ni/2, 1/2) ); % so it is in fact what is usually referred to as
endfor % regularized incomplete beta function!
%-------------------------------------------------------------------------------
% We plot the physical parameters against the mean score
%-------------------------------------------------------------------------------
label_y = cell(dim(1)+1);
label_y(1) = 'daily mean temperature (°C)';
label_y(2) = 'daily mean pressure (mbar)';
label_y(3) = 'daily min pressure (mbar)';
label_y(4) = 'daily max pressure (mbar)';
label_y(5) = 'daily mean relative humidity (%)';
label_y(6) = 'daily mean absolute humidity (g/m^{3})';
label_y(7) = 'daily mean air density (g/m^{3})';
label_y(8) = 'daily mean N_{2} (g/m^{3})';
label_y(9) = 'daily mean O_{2} (g/m^{3})';
label_y(10) = 'daily mean CO_{2} (g/m^{3})';
label_y(11) = 'daily mean PM 2.5 (AQI)';
label_y(12) = 'daily mean PM 2.5 ({\mu}g/m^{3})';
for h = 1:dim(1)-1
figure(h)
for i=1:n
plot (array(dim(1),i), array(h,i), 'o','markersize',5, 'markerfacecolor', 'r')
hold on
endfor
xlabel ('daily mean symptom score', 'fontsize',15)
ylabel (label_y(h), 'fontsize',15)
rhostr = num2str(rho(h));
pvalstr = num2str(pval(h));
tvaluestr = num2str(tvalue(h));
titlestr = strcat('Spearman correlation {\rho} = ', rhostr,', p = ', pvalstr, ', t = ', tvaluestr, ', delay = 0');
title (titlestr,'fontsize',15)
grid on
val2 = max(array(h,:));
val1 = min(array(h,:));
axis ([3.5,6.5,val1,val2])
plot ([3.5,6.5], [a(h)*3.5 + b(h), a(h)*6.5 + b(h)], '--b', 'linewidth', 2)
endfor
for h = dim(1):dim(1)+1
figure(h)
for i=1:m
plot (array2(1,i), array2(h-dim(1)+2,i), 'o','markersize',5, 'markerfacecolor', 'r')
hold on
endfor
xlabel ('daily mean symptom score', 'fontsize',15)
ylabel (label_y(h), 'fontsize',15)
rhostr = num2str(rho(h));
pvalstr = num2str(pval(h));
tvaluestr = num2str(tvalue(h));
titlestr = strcat('Spearman correlation {\rho} = ', rhostr,', p = ', pvalstr, ', t = ', tvaluestr, ', delay = 0');
title (titlestr,'fontsize',15)
grid on
val2 = max(array2(h-dim(1)+2,:));
val1 = min(array2(h-dim(1)+2,:));
axis ([3.5,6.5,val1,val2])
plot ([3.5,6.5], [a(h)*3.5 + b(h), a(h)*6.5 + b(h)], '--b', 'linewidth', 2)
endfor
%-------------------------------------------------------------------------------
% We plot the chart temp-absolute humidity, with iso-relative humidity curves at
% an athmospheric pressure of 1,013.25 mbar
%-------------------------------------------------------------------------------
% molecular weight of water
mu_v = 18.01528; % g/mol
% array of relative humidity (%)
RH2(1) = 10;
for i=2:20
RH2(i) = RH2(i-1)+5;
endfor
% array of temperature (celsius)
tmin= 10;
tmax= 30;
for j=tmin:tmax
t2(j) = j-1;
endfor
% array of pressure (hPa=mbar)
p_atm = 1013.25;
% array of absolute humidity (grams/m^3)----------------------------------------
for k=1:7
for i=1:20
for j=tmin:tmax
AH2(k,i,j) = 1000*(mu_v/1000)*(RH2(i)/(R*(273.15+t2(j))))*(1.0016+3.15*10^(-6)*p_atm-0.074/p_atm)*6.112*e^(17.62*t2(j)/(243.12+t2(j)));
endfor
endfor
endfor
f = h;
f = f + 1;
figure(f)
for i=1:2:20
plot (t2(tmin:tmax), AH2(k,i,tmin:tmax),'-k','LineWidth',2)
label = num2str(RH2(i));
label = strjoin ({label,'%'}, ' ');
text (tmax+0.5, AH2(k,i,tmax)+0.5,label,'fontsize',16)
hold on
endfor
axis ([tmin,tmax],"tic[xyz]", "label[xyz]")
xticks (t2(tmin:tmax))
yticks ([1:1:50])
xlabel ('temperature (°C)')
ylabel ('absolute humidity (g/{m^3})')
grid on
pressure_str = num2str(p_atm);
title_str = strcat('air pressure = ',pressure_str," mbar");
title (title_str)
%-------------------------------------------------------------------------------
% On the chart we have just plotted, we plot a red dot for a score of 4, a blue dot
% for a score of 5, a green dot for a score of 6. We consider score1, score2, score3
% instead of the mean scores. Scores are plotted assuming as coordinates temperature
% and absolute humidity of the day they refer to.
%-------------------------------------------------------------------------------
for i=1:n_num-1
if ( t(i)!= missing )
if (score1(i) == 4)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
endif
if (score1(i) == 5)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
endif
if (score1(i) == 6)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
endif
if (score2(i) == 4)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
endif
if (score2(i) == 5)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
endif
if (score2(i) == 6)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
endif
if (score3(i) == 4)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
endif
if (score3(i) == 5)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
endif
if (score3(i) == 6)
plot (t(i),AH(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
endif
endif
endfor
%-------------------------------------------------------------------------------
% On the plane temp-AD, we plot a red dot for a score of 4, a blue dot
% for a score of 5, a green dot for a score of 6. We consider score1, score2, score3
% instead of the mean scores. Scores are plotted assuming as coordinates temperature
% and absolute humidity of the day they refer to.
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=1:n_num-1
if ( t(i)!= missing )
if (score1(i) == 4)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
if (score1(i) == 5)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
endif
if (score1(i) == 6)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
endif
if (score2(i) == 4)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
if (score2(i) == 5)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
endif
if (score2(i) == 6)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
endif
if (score3(i) == 4)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
if (score3(i) == 5)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
endif
if (score3(i) == 6)
plot (t(i),AD(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
endif
endif
endfor
axis ([tmin,tmax])
xlabel (label_y(1), 'fontsize',15)
ylabel (label_y(7), 'fontsize',15)
grid on
grid minor
%-------------------------------------------------------------------------------
% We plot the environmental data for the period March 1st to June 9th 2021
% (Canary Island)
%-------------------------------------------------------------------------------
% temperature
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=1:102-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,t(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,t(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,t(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([31,31],[min(array(1,:)),max(array(1,:))],'--k','linewidth',1)
text(31-20,max(array(1,:))-2,'March', 'fontsize',15)
hold on
plot([62,62],[min(array(1,:)),max(array(1,:))],'--k','linewidth',1)
text(62-20,max(array(1,:))-2,'April', 'fontsize',15)
hold on
plot([93,93],[min(array(1,:)),max(array(1,:))],'--k','linewidth',1)
text(93-20,max(array(1,:))-2,'May', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(1), 'fontsize',15)
title ('Canary Islands, Mar-Jun 2021; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([1,101,min(array(1,:)),max(array(1,:))])
%-------------------------------------------------------------------------------
% absolute humidity
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=1:102-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,AH(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,AH(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,AH(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([31,31],[min(array(6,:)),max(array(6,:))],'--k','linewidth',1)
text(31-20,max(array(6,:))-2,'March', 'fontsize',15)
hold on
plot([62,62],[min(array(6,:)),max(array(6,:))],'--k','linewidth',1)
text(62-20,max(array(6,:))-2,'April', 'fontsize',15)
hold on
plot([93,93],[min(array(6,:)),max(array(6,:))],'--k','linewidth',1)
text(93-20,max(array(6,:))-2,'May', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(6), 'fontsize',15)
title ('Canary Islands, Mar-Jun 2021; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([1,101,min(array(6,:)),max(array(6,:))])
%-------------------------------------------------------------------------------
% air density
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=1:102-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,AD(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,AD(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,AD(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([31,31],[min(array(7,:)),max(array(7,:))],'--k','linewidth',1)
text(31-20,max(array(7,:))-2,'March', 'fontsize',15)
hold on
plot([62,62],[min(array(7,:)),max(array(7,:))],'--k','linewidth',1)
text(62-20,max(array(7,:))-2,'April', 'fontsize',15)
hold on
plot([93,93],[min(array(7,:)),max(array(7,:))],'--k','linewidth',1)
text(93-20,max(array(7,:))-2,'May', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(7), 'fontsize',15)
title ('Canary Islands, Mar-Jun 2021; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([1,101,min(array(7,:)),max(array(7,:))])
%-------------------------------------------------------------------------------
% We plot the environmental data for the period February to March 2020
% (Rosario, santa Fe)
%-------------------------------------------------------------------------------
% temperature
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=103-1:138-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,t(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,t(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,t(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([131,131],[min(array(1,:)),max(array(1,:))],'--k','linewidth',1)
text(131-20,max(array(1,:))-2,'Feb', 'fontsize',15)
hold on
text(131+10,max(array(1,:))-2,'March', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(1), 'fontsize',15)
title ('Rosario, Feb-Mar 2020; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([103-1,138-1,min(array(1,:)),max(array(1,:))])
%-------------------------------------------------------------------------------
% absolute humidity
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=103-1:138-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,AH(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,AH(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,AH(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([131,131],[min(array(6,:)),max(array(6,:))],'--k','linewidth',1)
text(131-20,max(array(6,:))-2,'Feb', 'fontsize',15)
hold on
text(131+10,max(array(6,:))-2,'March', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(6), 'fontsize',15)
title ('Rosario, Feb-Mar 2020; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([103-1,138-1,min(array(6,:)),max(array(6,:))])
%-------------------------------------------------------------------------------
% air density
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=103-1:138-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,AD(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,AD(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,AD(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([131,131],[min(array(7,:)),max(array(7,:))],'--k','linewidth',1)
text(131-20,max(array(7,:))-2,'Feb', 'fontsize',15)
hold on
text(131+10,max(array(7,:))-2,'March', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(7), 'fontsize',15)
title ('Rosario, Feb-Mar 2020; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([103-1,138-1,min(array(7,:)),max(array(7,:))])
%-------------------------------------------------------------------------------
% We plot the environmental data for the period Sept to Oct 2020
% (Rome)
%-------------------------------------------------------------------------------
% temperature
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=139-1:199-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,t(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,t(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,t(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([168,168],[min(array(1,:)),max(array(1,:))],'--k','linewidth',1)
text(138+10,max(array(1,:))-2,'Sep', 'fontsize',15)
hold on
text(168+5,max(array(1,:))-2,'Oct', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(1), 'fontsize',15)
title ('Rome, Sep-Oct 2020; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([139-1,199-1,min(array(1,:)),max(array(1,:))])
%-------------------------------------------------------------------------------
% absolute humidity
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=139-1:199-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,AH(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,AH(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,AH(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([168,168],[min(array(6,:)),max(array(6,:))],'--k','linewidth',1)
text(138+10,max(array(6,:))-2,'Sep', 'fontsize',15)
hold on
text(168+5,max(array(6,:))-2,'Oct', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(6), 'fontsize',15)
title ('Rome, Sep-Oct 2020; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([139-1,199-1,min(array(6,:)),max(array(6,:))])
%-------------------------------------------------------------------------------
% air density
%-------------------------------------------------------------------------------
f = f + 1;
figure(f)
for i=139-1:199-1
if ( t(i)!= missing )
if (score(i) > 5)
plot (i,AD(i),'o','markersize',4,'markerfacecolor','g','markeredgecolor','g')
hold on
elseif (score(i) == 5 )
plot (i,AD(i),'o','markersize',4,'markerfacecolor','b','markeredgecolor','b')
hold on
else
plot (i,AD(i),'o','markersize',4,'markerfacecolor','r','markeredgecolor','r')
hold on
endif
endif
endfor
plot([168,168],[min(array(7,:)),max(array(7,:))],'--k','linewidth',1)
text(138+10,max(array(7,:))-2,'Sep', 'fontsize',15)
hold on
text(168+5,max(array(7,:))-2,'Oct', 'fontsize',15)
grid on
grid minor
xlabel ('day', 'fontsize',15)
ylabel (label_y(7), 'fontsize',15)
title ('Rome, Sep-Oct 2020; green: mean score > 5; blue: mean score = 5; red: mean score < 5','fontsize',15)
axis([139-1,199-1,min(array(7,:)),max(array(7,:))])

Update on the UK Biobank: analysis on variants with a minor allele frequency between 0.01 and 0.05

Update on the UK Biobank: analysis on variants with a minor allele frequency between 0.01 and 0.05

Abstract

I report on the association between variants with a minor allele frequency included between 1% and 5% and the phenotypes: self-reported Chronic Fatigue Syndrome and chronic asthenia not otherwise specified (ICD10: R53). The analysis was performed on a metadata file generated from the UK Biobank database. Patients with self-reported CFS (both sexes) showed a significant increase (p = 2.26\cdot10^{-9}) in the frequency of the alternative allele of variant rs148723539, 10:131677233:G:A on h19, an SNP of the intronic region of gene EBF3. Female patients with R53 showed a significant association (p = 5.40\cdot10^{-9}) with variant rs182581502, 7:56492485:G:T on h19, which belongs to the intronic region of pseudogene RP13-492C18.2 (gene_id: ENSG00000237268.2). This analysis completes a previous one (here) performed only on common variants (minor allele frequency above 5%).

Introduction

In a previous blog post (here), I reported on the association between self-reported Chronic Fatigue Syndrome and a region of chromosome 13, in particular variant rs11147812. This result was obtained by performing a set of analyses on a metadata file generated by Neale’s Lab from the UK Biobank dataset. The analysis included about 14 million variants, 1659 patients (451 males), and 300k controls. I focused on common variants (minor allele frequency above 0.05) and I used a cut-off for statistical significance of 5.0\cdot10^{-8}. I performed a similar analysis on chronic asthenia not otherwise specified (ICD10: R53) and I found an association between male patients and variant rs62092652.

Here, I report on the results of the same set of analyses for variants with a minor allele frequency below 0.05 and above 0.01. I used a more stringent cut-off for statistical significance of 1.0\cdot10^{-8} (read this blog post for an introduction to the p value in GWAS).

Methods

I considered again the phenotypes: self-reported CFS and R53. I filtered out variants too far from the Hardy-Weinberg equilibrium (in the total UK Biobank sample) by using a cut-off of 1.0\cdot10^{-6} when testing the null hypothesis: the alleles are in HWE. I filtered out variants with expected minor allele count below 25, in cases.

Results

When considering self-reported CFS, the only statistically significant association was between variant rs148723539 (10:131677233:G:A on h19) and the group of patients that included both sexes (Table 1). In particular, the association is between the alternative allele and patients (in other words, patients have a higher frequency of the alternative allele A than controls). This is an intronic variant of gene EBF3. No association was found after stratification by sex.

variantconsmin AFp valgene
rs148723539intron
variant
0.01012.26e-09EBF3
Table 1. Self-reported Chronic Fatigue Syndrome, both sexes (n = 1659 patients).

When considering chronic asthenia not otherwise specified (ICD10: R53), the analysis for the whole sample (both sexes) gave no associations. When considering females only, variant rs182581502 (7:56492485:G:T on h19) reached statistical significance with the alternative allele more frequent in patients than in controls (Table 2). This is an intronic variant of pseudogene RP13-492C18.2 (gene_id: ENSG00000237268.2). No associations were found for males only.

rsidconsmin AFp valgene
rs182581502intron
variant
0.02865.40e-09RP13-492C18.2
Table 2. Chronic asthenia not otherwise specified (ICD10: R53), females only (n = 456).

Variant rs182581502 is associated with changes in gene expression of gene CHCHD2 in several tissues (see this page). The alternative allele (the one more frequent in female R53 patients) is associated with an increase in the expression of CHCHD2 in the hippocampus and basal ganglia, for instance. No effects on gene expression have been found for rs148723539.

A concise summary of the results of my analysis of the UK Biobank database is presented in the following table.

My Office

My Office

Così’l maestro; e io “Alcun compenso”

dissi lui “trova, che ‘l tempo non passi

perduto”. Ed elli: “Vedi ch’a ciò penso.”

Dante, Inferno, XI, 13-15

I can’t sit at a desk, if not for short periods: sitting drastically reduces my cognitive performance. This corner is where I spend my days, during summer.

In general, having such a heterogenous display of books at hand (from biology to math, from anatomy for arts to computer science, etc.) is not good, if you have to focus on a project. But in my case, I find that when I am too sick to do mathematics, I may still have some energy left, to spend on drawing or reading.

So, if I want to minimize the time lost, I have to continuously switch activities, according to how I feel at that particular moment. And still, most of my life goes wasted, despite my best efforts.

I have calculated that the total amount of good days per year (the ones during which I can think) is of about two months, on average. Some years I had more days than that, several years I did not improve at all. This has been my life since I was 20-22.

I versi degli antichi

I versi degli antichi

Catullo ha scritto quasi 21 secoli fa ma è contemporaneo, sia per il linguaggio che per il contenuto. Solo la lingua è antica; ma sopravvissuta plus uno perenne saeclo, se si pensa che ancora all’inizio del Novecento il latino si usava per gli articoli scientifici (R) e Newton usò il latino per scrivere quella che è (e forse rimarrà per sempre) la singola opera scientifica più importante in assoluto, i Philosophiae Naturalis Principia Mathematica (1687). Non dico nulla di nuovo, lo so; ma può darsi che, se tornerete a Catullo dopo una vita, scoprirete davvero questa banalità per la prima volta, come è successo a me. Catullo ha detto già tanto, forse tutto, sull’amore, l’amicizia, e il dolore. E quello che manca non ha potuto dirlo solo perché quella notte che est perpetua una dormienda, per lui è arrivata troppo presto, negandogli le esperienze della maturità e della vecchiezza. Ma in fondo, si dice, i poeti (come i matematici) non possono sopravvivere alla giovinezza, se non a costo di cambiare mestiere.

I carmi di Catullo sono come i vecchi codici di integrazione numerica in FORTRAN: un paradigma che si ripete in ogni linguaggio, mai più universale però come la prima volta. Scritti una volta per tutte, destinati ad essere copiati per sempre: in Python, Matlab, Julia, Octave, R, e tutti i compilatori che verranno.

Qui propongo la traduzione di due carmi, tra i più famosi (come se ce ne fosse bisogno): il carme CI l’ho reso in endecasillabi, il carme VIII con versi composti, forzati dalle interrogative finali, che non sembrano ammettere una riduzione. Una traduzione è sempre opera del traduttore, non sarà mai fedele: la speranza di rendere i suoni, le allitterazioni, e il ritmo è talmente vana da essere folle. E poi la grafia, anche quella forse conta: le V con la loro simmetrica decisione, le P al vento, le morbide B. Tutto significa qualcosa e non tutto è traducibile. Catullo poi sembra davvero non avere bisogno di essere attualizzato: è un uomo come noi. Per cui questo è soprattutto un invito a rileggere l’originale.   

Con la speranza, nel tempo, di aggiungere altre traduzioni, anche di altri autori.     

(Foto: affresco della Villa dei Misteri, Pompei, prima del 23 d.C.)

Catulli veronensis carmina, CI (3 agosto 2022)

Per distese di acque, di gente in gente
giungo qui al tuo mesto funerale
per onorarti con l'ultimo dono
e parlare alla tua cenere muta,
fratello che la sorte mi ha già tolto,
strappato, ahimè, così crudelmente. 
Accetta doni funebri almeno,
secondo la tradizione dei padri,
bagnati del pianto mio fraterno.
Ti saluto, ora e per sempre addio.   

Per il testo originale e la lettura metrica si veda qui.
Catulli veronensis carmina, VIII (luglio 2022)

Povero Catullo, dalla follia desisti,
e ora accetta che ciò che è perduto è perso.
Giorni luminosi brillarono un tempo,
quando ti affannavi dietro i capricci
dell'amata come amata nessuna mai,
si consumavano gli infiniti giochi
d'amore che bramavi e lei non negava.
Davvero brillarono giorni luminosi.
Ma lei ora non vuole più e tu fa' altrettanto,
non rincorrerla, affràncati dalla miseria,
ma sopporta con animo ostinato, resisti.
Addio, ragazza, ti resisterà Catullo,
non ti cercherà più, non ti vorrà se non vuoi:
ma soffrirai quando non sarai più voluta.
Maledetta! Dove ti porta ora la vita?
Chi verrà ora a trovarti? Per chi sarai bella?
Chi amerai ora? Di chi sarai per il mondo?
Chi bacerai? A chi morderai le labbra?
Ma tu Catullo ostinatamente persisti.  

Il verso 5 (amata nobis quam amabitur nulla) lo si ritrova quasi identico nel carme XXXVII, verso 12 (amata tantum quam amabitur nulla). Eppure tanto il carme VIII scorre su una nota di delicata sensibilità, quanto il 37 esprime una violenta, sconcertante, volgarità (si veda qui per una traduzione del XXXVII).

Per il testo originale e la lettura metrica si veda qui.
Catulli veronensis carmina, I (agosto 2022)

A chi dedico il nuovo libello,
gioiello emendato d'ogni difetto?
A te che eri solito, Cornelio,
lodare queste mie cose da nulla,
da quando solo sulla Penisola
di tutto il Tempo ti cimentavi
in tre volumi ponderosi e dotti,
per Giove, a raccontare ricordi.
Accetta pertanto questo libello,
per ciò che vale e che sopravvivere,
Signora fanciulla, possa per sempre.

Per il testo originale e la lettura metrica si veda qui.
Aeneis, Liber II, v 201-224 (Agosto 2022)

Assegnato al culto del dio Nettuno
Laocoonte un degno toro offriva.
Ma da Tenedo adesso le calme acque
sovrastano immensi due serpenti
che speculari puntano la costa,
i colli eretti tra i flutti, vermiglie
le creste sopra le onde, immensa mole
del corpo si snoda, e sfiora il mare.
Scroscio di schiuma, e sono sulla riva,
gli occhi iniettati di sangue di fuoco,
lingue vibranti e labbra sibilanti.
Fuggiamo, a Laocoonte aspirano,
ma prima i piccoli corpi dei figli
ambedue i serpenti avvolti stringon
e ingoiano i morsi dei miseri arti.
Poi assalgono il padre accorso in aiuto
armato che nelle spire è legato;
e già su di lui torreggiano, stretto
due volte il busto, per due il collo avvinto. 
Mentre tenta di liberare i nodi,
le vesti pregne di bava letale,
grida disumane lancia alle stelle,
qual mugge il toro che l'altare fugge
scuotendo il collo, la malferma scure.

Reso in edencasillabi. Di seguito riporto il conteggio delle sillabe, tenendo conto delle sinalefe.

assegnatoalcultodeldioNettuno
Laocoontedegnotorooffriva
madaTenedoadessolecalmeacque
sovrastanoimmensidueserpenti
chespecularipuntanolacosta
icollierettitraifluttivermiglie
lecrestesopraleondeimmensamole
delcorposisnodaesfiorailmare
scrosciodischiumaesonosullariva
gliocchiiniettatidisangueedifuoco
linguevibrantielabbrasibilanti
fuggiamoalaocoonteaspirano
maprimaipiccolicorpideifigli
ambedueiserpentiavvoltistringon
eingoianoiorsideimiseriarti
poiassalgonoilpadreaccorsoinaiuto
armatochenellespireèlegato
egiàsudiluitorreggianostretto
duevolteilbustoperdueilcolloavvinto
mentretentadiliberareinodi
levestipregnedibavaletale
gridadisumanelanciaallestelle
qualmuggeiltorochelaltarefugge
scuotendoilcollolaalfermascure

L’intero secondo libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti.

Laocoon, ductus Neptuno forte sacerdos,
solemnes taurum ingentem mactabat ad aras. 
Ecce autem gemini a Tenedo tranquilla per alta
(horresco referens) immensis orbibus angues
incumbunt pelago, pariterque ad litora tendunt:
pectora quorum inter fluctus arrecta, iubaeque
sanguineae exsuperant undas: pars cetera pontum
pone legit, sinvatque immensa volumine terga.
Fit sonitus spumante salo: iamque arva tenebant,
ardentesque oculos suffecti sanguine, et igni,
sibila lambebant linguis vibrantibus ora.
Diffugimus visu exsangues: illi agmine certo
Laocoonta petunt, et primum parva duorum
corpora natorum serpens amplexus uterque
implicat, et miseros morsu depascitur artus.
Post ipsum auxilio subeuntem ac tela ferentem
corripiunt spirisque ligant ingentibus; et iam
bis medium amplexi, bis collo squamea circum
terga dati, superant capite et cervicibus altis.
Ille simul manibus tendit divellere nodos
perfusus sanie vittas atroque veneno;
clamores simul horrendos ad sidera tollit,
quales mugitus, fugit cum saucius aras
taurus et incertam excussit cervice securim.
At gemini lapsu delubra ad summa dracones
effugiunt, saevaeque petunt Tritonidis arcem,
sub pedibusque deae, clypeique sub orbe teguntur.

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Laocoon, ductus sacerdos Neptuno forte, mactabat ingentem taurum ad aras solemnes.
Laocoonte, nominato sacerdote di Nettuno per sorteggio, uccideva un grande toro presso i solenni altari.
Ecce autem a Tenedo per alta tranquilla [aequora] angues gemini (horresco referens) incumbunt pelago immensis orbibus, pariterque tendunt ad litora:
Ma ecco che da Tenedo, attraverso le acque tranquille, due serpenti gemelli (inorridisco nel raccontarlo) sovrastano il mare con le spire immense, e puntano la riva all’unisono:
pectora quorum arrecta [sunt] inter fluctus, iubaeque sanguineae exsuperant undas: pars cetera legit pontum, pone, sinvatque volumine immensa terga [= terga immenso volumine, ipallage].
i petti dei quali sono eretti sui flutti, e le creste vermiglie si innalzano oltre le onde: il resto del corpo sfiora il mare, dietro, e snoda il dorso in immense spire.
Sonitus fit salo spumante: iamque tenebat arva et, oculos ardentes [acc. di rel.] suffecti sanguine et igni, lambebant sibila ora linguis vibrantibus.
Un gorgoglio è generato dalla mare spumeggiante: già avevano raggiunto la costa e, con occhi ardenti iniettati di sangue e fuoco, lambivano le bocche sibilanto con lingue vibranti.
Diffugimus exangues visu: illi petunt Laocoonta, agmine certo, et primum uterque serpens amplexus implicat parva corpora duorum natorum, et depascitur miseros artus morsu.
Scappiamo con visi esangui: essi puntano Laocoonte, con andatura decisa, e prima i due serpenti stringono, avvolti, i piccoli corpi dei due figli, e divorano i miseri arti a morsi.
Post corripiunt ipsum [Laocoonta], auxilio subeuntem ac tela ferentem, et ligant spiris ingentibus;
Quindi assalgono lo stesso Laocoonte, che accorre in soccorso e porta delle armi, e lo avvincono con le ingenti spire;
et iam amplexi bis medium [acc. di rel.], circumdati [timesi] squamea terga [acc. di rel.] bis collo, superant altis capite et cervicibus.
e stretto due volte il busto [di Laocoonte], due volte avvolte intorno al collo le terga squamose, già torreggiano con il collo e il capo.
Ille simul tendit divellere nodos manibus, vittas perfusus [acc. alla greca] sanie et atro veneno; simul tollit horrendos clamores ad sidera:
Lui, con le bende imbevute di bava e veleno nero, tenta di sciogliere i nodi con le mani mentre leva orrende grida al cielo,
quales mugitus taurus [tollit], cum fugit saucius aras, et excussit incertam securim cervice.
come i muggiti del toro che fugge ferito dall’altare mentre si squote dal collo la scure malferma.
At gemini dracones effugiunt lapsu ad summa delubra, et petunt arcem saevae Tritonidis, et teguntur sub pedibus deae, et sub orbe clypei.
E i draghi gemelli fuggono strisciando verso gli alti santuari, e si dirigono all’altare della ostile Tritonia [Atena], e si nascondono sotto i piedi della dea, sotto il cerchio dello scudo.
Aeneis, Liber IV, v 607-621 (Gennaio 2023)

Sole, tu che illumini i giorni umani,
Giunone, che sai del mio dolore,
Ecate, che tormenti i sonni urbani.

E voi Dire e dèi d'Elissa che muore,
se sventura benevolenza vale,
ascoltatemi. Poiché l'impostore

le ancore getterà al litorale
e questo Giove comanda che accada,
almeno che un nemico eccezionale

incontri, solitario esule vada,
implori aiuto, e veda le morti
amare dei suoi e la vita non goda  

e il trono e il regno a pace iniqua porti.
Ma cada anzitempo e senza sepolcro.
Ciò chiedo col sangue per le sue sorti.

Terzine con rime ABA, BCB, …. Di seguito riporto il conteggio delle sillabe, tenendo conto delle sinalefe.

Soletucheilluminiigiorniumani
Giunonechesaidelmiodolore
Ecatechetormentiisonniurbani
evoiDiraeedéid’Elissachemuore
sesventurabenevolenzavale
ascoltatemipoichél’impostore
leancoregetteallitorale
equestoGiovecomandacheaccada
almenocheunnemicoeccezzionale
incontrisolitarioesulevada
imploriaiutoevedalemorti
amaredeisuoielavitanongoda
eiltronoeilregnoapaceiniquaporti
Macadaanzitempoesenzasepolcro.
Ciòchiedocolsangueperlesuesorti
L'intero quarto libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti.

Sol, qui terrarum flammis opera omnia lustras;
tuque harum interpres curarum et conscia, Iuno,
nocturnisque Hecate triviis ululata per urbes,
et Dirae ultrices, et di morientis Elisae,
accipite haec: meritumque malis advertite numen,
et nostras audite preces. Si tangere portus
infandum caput, ac terris adnare necessest:
et si fata Iovis poscunt; hic terminus haeret:
at bello audacis populi vexatus, et armis,
finibus extorris, complexu avulsus Iuli,
auxilium imploret, videatque indigna suorum
funera: nec, cum se sub leges pacis iniquae
tradiderit, regno aut optata luce fruatur:
sed cadat ante diem mediaque inhumatus arena.
Haec precor, hanc vocem extremam cum sanguine fundo. 

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Sol, qui flammis opera omnia terrarum lustras;
Sole, che illumini con il fuoco tutte le attività della Terra;
et tu, Iuno, interpres et conscia harum curarum,
e tu, Giunone, intermediaria e complice di questi affanni
et Hecate ululata nocturnis triviis per urbes,
e Ecate, invocata con ululati nei trivi di notte, per le città,
et Dirae ultrices, et di morientis Elisae,
e Dirae vendici, e dèi di Elissa che muore
accipite haec: et advertite malis meritum numen, et nostras audite preces.
accettate queste [parole] e rivolgete alle sventure la meritata benevolenza, e ascoltate le mie preghiere.
Si necessest infandum caput tangere portus ac terris adnare et si fata Iovis poscunt
Se è inevitabile che lo scellerato debba toccare il porto e raggiungere la terra e questo stabilisce il volere di Giove,
hic terminus haeret: at vexatus bello et armis audacis populi,
che così sia: almeno sia vessato dalla opposizione armata di un popolo audace,
finibus extorris, avulsus complexu Iuli, auxilium imploret,
sia bandito dal territorio, lontano dall’abbraccio di Iulio, implori aiuto,
videatque indigna suorum funera: nec, cum se tradiderit sub leges iniquae pacis, regno aut optata luce fruatur:
assista alla morte indegna dei suoi, né – sottopostosi a un patto iniquo di pace – goda il regno e la dolce vita:
sed cadat ante diem et inhumatus media arena.
ma cada anzi tempo e resti senza sepoltura sulla spiaggia.
Haec precor, hanc vocem extremam cum sanguine fundo.
Di questo vi supplico; queste ultime parole pronuncio col sangue.
Catulli veronensis carmina, V (Buenos Aires, 11 febrero 2023)

Lasciati amare, Lesbia, e vivere
e i commenti dei vecchi, invidiosi
valgano le monete più misere.

Giorni seguono giorni luminosi
ma esaurito il nostro breve momento
per sempre dormiremo silenziosi.

Dammi mille baci, e poi altri cento,
dammene ancora mille e cento ancora,
poi mille e più sulle labbra un accento.

E se su migliaia sorge l'aurora
ne confondiamo il numero perché
non è malevolo chi gioia ignora, 
chi non sa quanti baci, tra te e me.  

Per il testo originale e la lettura metrica si veda qui. 

Analysis of a summary statistics generated from the UK Biobank database: new potential risk loci for ME/CFS and not otherwise specified chronic asthenia

Analysis of a summary statistics generated from the UK Biobank database: new potential risk loci for ME/CFS and not otherwise specified chronic asthenia

… the only thing that is arbitrary about the various orders of a set of terms is our attention, for the terms themselves have always all the orders of which they are capable.

Bertrand Russell, Introduction to Mathematical Philosophy

Full-text article

I present here an analysis of the summary statistics elaborated by Neale’s Lab from the raw data released by the UK Biobank, a large-scale biomedical database that includes genetic data on 500,000 UK citizens. I filtered out variants with a minor allele frequency below 0.05, I included only variants that reached a p value below 5⋅10^−7 (even though only p < 5⋅10^−8 was considered for definitive associations), and I filtered out variants with a p value for the Hardy-Weinberg equilibrium below 10^−6.

Females with self-reported Chronic Fatigue Syndrome are associated with a region of chromosome 13 with high linkage disequilibrium, from position 41353297 to 41404706 (on h19) which includes gene SLC25A15. After applying statistical methods of fine-mapping (approximation of the joint model and posterior inclusion probability, PIP), I found rs11147812 (13:41404706:T:C) as the possible causal variant within this region. This same variant is associated with the whole sample of patients (males + females) at 5⋅10^−8 < p < 5⋅10^−7. The relaxed cutoff for statistical significance of 5⋅10^−7 has been recently proposed as a way to increase the rate of true positives without a substantial increase in false positive associations, in studies with a sample of 130,000. Patients presented a reduced frequency of the alternative allele at position 13:41404706, and this is expected to reduce the expression of SLC25A15 in adipose tissue and other tissues. Gene SLC25A15 encodes mitochondrial ornithine transporter I which is involved in the transport of ornithine inside mitochondria.

Males with chronic asthenia not otherwise specified (ICD10: R53) showed an association with a region in high LD of chromosome 18 (18:55452281 to 18:55460845). The only variant from this region with p < 5⋅10^−8 is rs62092652 (18:55454761:G:A) and it is confirmed as the causal variant in this region by PIP calculation. The alternative allele at this position is associated with a reduced expression of gene ATP8B1 in the brain. Since the alternative allele is more frequent in patients than in controls (frequency of 0.3501 and 0.2422, respectively), we may expect to find a reduced expression of ATP8B1 in the brain of patients. ATP8B1 encodes a member of the P-type cation transport ATPase family, which transport phosphatidylserine and phosphatidylethanolamine from one side of a bilayer to another. These two molecules are both phospholipids found in biological membranes.

Genetic data from the UK Biobank were also used to test previously proposed associations between ME/CFS and variants on TNF: none of the proposed associations was confirmed.

No overlap of the genetic signal from self-reported CFS and R53 was found with the psychiatric traits: bipolar II and depression.

This document also includes an introduction to some of the methods currently employed in the study of GWAS summary statistics. 

Full-text article

Tryptophan metabolites in the cerebrospinal fluid of ME/CFS patients

Tryptophan metabolites in the cerebrospinal fluid of ME/CFS patients

Abstract

I present here a comparison between the levels of tryptophan (Trp), kynurenine (Kyn), serotonin (Ser), Kyn/Trp, and Ser/Trp in cerebrospinal fluid of 44 ME/CFS patients vs 21 sedentary controls. Raw data were retrieved from (Baraniuk JN et al. 2021). Stratification by sex has been included in the analysis. No differences can be found between patients and controls.

Methods

Once downloaded the raw data of (Baraniuk JN et al. 2021), I searched for metabolites of tryptophan metabolism by using the keywords: try, kyn, ser, quinolinic, picolinic, anthranilic, xanthurenic, melatonin. I retrieved the data for tryptophan, kynurenine, and serotonin, and I used them to calculate the ratios kynurenine/tryptophan and serotonin/tryptophan, for each patient. I then organized the data in three csv files (see supplementary material), one including the whole sample, one including females only, and one with males only. For each of the five variables Trp, Kyn, Ser, Kyn/Trp, Ser/Trp a statistical test was performed by the R script displayed at the bottom of this page (supplementary material). For the sample including both sexes, I run both the Student’s t-test and the Wilcoxon test, while for the other two samples only the latter test was performed. I removed a female patient from the data because of her unusually high level of serotonin (0.202), but this does not change the conclusion of this analysis.

ME/CFS (44)Sedentary control (21)t-test
p value
Wilcoxon
p value
Trp2.55 (0.652)2.42 (0.688)0.470.60
Kyn0.0234 (0.0271)0.0154 (0.0200)0.240.27
Ser0.0110 (0.00597)0.00805 (0.00356)0.0410.028
Kyn/Trp0.00936 (0.0113)0.00580 (0.00789)0.2000.27
Ser/Trp0.00448 (0.00227)0.00349 (0.00188)0.0870.037
Table 1. Comparison between the levels of tryptophan (Trp), kynurenine (Kyn), serotonin (Ser), Kyn/Trp, and Ser/Trp in cerebrospinal fluid of 44 ME/CFS patients and 21 controls. Both the two-tailed Student’s t-test and the Wilcoxon test were employed. No correction for multiple comparisons is applied. Levels are reported as: mean (standard deviation of the sample).

Results

Serotonin and Ser/Trp are significantly elevated in ME/CFS patients vs sedentary controls (p = 0.028 and 0.037, respectively), Table 1, Figure 1. But once we apply a correction for three independent variables, these differences are no more statistically significant. When we stratified by sex, none of the comparisons led to a statistically significant difference between patients and controls (Figure 2, Figure 3). The conclusion is that no difference can be found in the level of Trp, Kyn, Ser, Kyn/Trp, and Ser/Trp in cerebrospinal fluid of ME/CFS patients when compared to sedentary controls. One female patient presented a very elevated serotonin level (she was removed from the analysis), another female patient showed elevated kynurenine, one male with ME/CFS had elevated tryptophan, and another male patient showed elevated kynurenine. The larger number of patients compared to controls might explain the presence, in patients, of some extreme values of the parameters considered, when compared to controls.

Figure 1. Comparison between the levels of tryptophan (Trp), kynurenine (Kyn), serotonin (Ser), Kyn/Trp, and Ser/Trp in cerebrospinal fluid of 44 ME/CFS patients and 21 controls. For each variable, the median, the 1st, and the 3rd quartile are indicated.
Figure 2. Comparison between the levels of tryptophan (Trp), kynurenine (Kyn), serotonin (Ser), Kyn/Trp, and Ser/Trp in cerebrospinal fluid of 35 female ME/CFS patients and 11 female controls. For each variable, the median, the 1st, and the 3rd quartile are indicated. For each comparison, the p value from the Wilcoxon test is displayed.
Figure 3. Comparison between the levels of tryptophan (Trp), kynurenine (Kyn), serotonin (Ser), Kyn/Trp, and Ser/Trp in cerebrospinal fluid of 9 male ME/CFS patients and 10 male controls. For each variable, the median, the 1st, and the 3rd quartile are indicated. For each comparison, the p value from the Wilcoxon test is displayed.

Supplementary material

The following R script calculates Table 1 and plots Figures 1, 2, and 3. It reads the three csv files below (click to download), one with both sexes lumped together, one with males, and one with females, respectively.

Trp_met.csv

Trp_met_females.csv

Trp_met_males.csv

# file name: tryptophan_wilcox_both_sexes
#
samples<-read.csv("Trp_met.csv", sep=";", header = TRUE) # we read the data
attach(samples) # this allows us to refer to the labels as variables 
#
# we define the number of patients and controls
#
ncfs<-length(samples[Group=="cfs0",1])
nsc<-length(samples[Group=="sc0",1])
#
# we store the measures of each metabolite for patients
#
kyn_cfs<-Kyn[1:ncfs]
trp_cfs<-Trp[1:ncfs]
ser_cfs<-Ser[1:ncfs]
#
# we store the measures of each metabolite for controls
#
a<-ncfs+1
kyn_sc<-Kyn[a:length(Kyn)]
trp_sc<-Trp[a:length(Kyn)]
ser_sc<-Ser[a:length(Kyn)]
#
# we calculate the ratios kyn/trp and ser/trp for patients
#
kyn_trp_cfs<-kyn_cfs/trp_cfs
ser_trp_cfs<-ser_cfs/trp_cfs
#
# we calculate the ratios kyn/trp and ser/trp for controls
#
kyn_trp_sc<-kyn_sc/trp_sc
ser_trp_sc<-ser_sc/trp_sc
#
# we plot the data for each metabolite: box-plots with points
#
plot(factor(Group),Kyn,xlab="groups",ylab="Kynurenine")
points(factor(Group),Kyn,pch=21,bg="red")
plot(factor(Group),Trp,xlab="groups",ylab="Tryptophan")
points(factor(Group),Trp,pch=21,bg="red")
plot(factor(Group),Ser,xlab="groups",ylab="Serotonin")
points(factor(Group),Ser,pch=21,bg="red")
#
# we plot the data for the two ratios
#
plot(factor(Group),c(kyn_trp_cfs,kyn_trp_sc),xlab="groups",ylab="Kyn/Trp")
points(factor(Group),c(kyn_trp_cfs,kyn_trp_sc),pch=21,bg="red")
plot(factor(Group),c(ser_trp_cfs,ser_trp_sc),xlab="groups",ylab="Ser/Trp")
points(factor(Group),c(ser_trp_cfs,ser_trp_sc),pch=21,bg="red")
#
# we run the Wilcoxon test for each metabolite and ratio
#
wilcox.test(kyn_cfs,kyn_sc)
wilcox.test(trp_cfs,trp_sc)
wilcox.test(ser_cfs,ser_sc)
wilcox.test(kyn_trp_cfs,kyn_trp_sc)
wilcox.test(ser_trp_cfs,ser_trp_sc) 

Versi

Versi

quare habe tibi quidquid hoc libelli

Caio Valerio Catullo

… La veo aquí y ahora,

pero también la veo en un antiguo

crepúsculo de Ur de los Caldeos

Jorge Luis Borges

Le mie poesie, per lo più in ordine cronologico, dalla adolescenza a oggi. Forse due sono riuscite per metà. Ho trovato stupito degli endecasillabi, involontari come le espressioni del papà che ci sorprendono allo specchio, quando abbiamo la sua età. Ma per lo più la matrice è quella indicata da una delle poesie stesse, che dice:

Prima di partire (primavera 1995) 

Caro ippocastano, oggi come sempre
se lo sguardo dai miei studi levo
a te li volgo e penso: ippocastano,
vero non è che uguali tutte le piante
sono perch'io le fronde tue fra tante  
più care, le avrei riconosciute.

Caro ippocastano, oggi verdi e fresche
le tue foglie sono, e i germogli 
di primavera sanno e sussurrano
ma dimmi se non ricordi l’inverno! 
Insieme l’uno e l'altro accanto
abbiamo pianto, o forse ho pianto io
perché tu composto l’hai provato.

Ma sapevi che par morte ciò ch'è sonno
perché quando a punzecchiare cincia
riprese leggermente, come sempre 
quest’anno i rami ho visto rinverdire.
Talora guardo alla finestra e noto 
compiaciuto il tuo risveglio, ippocastano 
ma tu sai come vanno le umane cose!

Assieme l’uno all’altro accanto 
abbiamo vissuto, ma non ho radici 
e a cambiar dimora sono costretto.
Qualora giù dal basso una carezza
sentirai, piangi caro ippocastano
perché io piangendo me ne vado.
La trattoria (primavera 1996)

Voci miste
posate incrociate
come campanelli bicchieri
tintinnio che al brusio s’assomma
musica al nascer si confonde
e talora risa sguaiate e forti
da esso emergono improvvise.
Bottiglie disposte in file
riflettono numerose luci
dietro le vetrine.

Il cameriere rapido
corre tra tovaglie bianche
e bianchi tovaglioli
salvietta sulle spalle
sempre col sorriso.

Ma laggiù quell’uomo
è sordo perso
nel fondo smosso
di un bicchiere.
Il gufo (11 giugno 1996, ore 15:38)

Il gufo volge teso i suoi languidi lumi.
Bagliori penetrano le tenebre
e nel bosco indietreggia la notte.
Aspetta, raccolto nel folto
col fiato sospeso.
Ma si apre ormai l’occhio
sulle valli incantate.
Fruscio improvviso rompe per primo il silenzio.
Il ramo, scosso, ondeggia.

Eco di pianto lontano.
E’ solo il giorno
che si rinnova.
Il gufo (18 giugno 1996, ore 21:06)

Prima del primo vagito dalla culla
del primo ronzare d'api per le valli
dell'acuto grido del rapace sui dirupi
il fruscio d'ali del gufo è il primo rumore
del mattino. 
Commiato (luglio 1996)

Addio verdi pascoli e colli sinuosi
valli silenziose e austeri picchi
fresche fronde e giocosa fonte,
il sussurrio m'è dolce nell'ora estrema.

Addio carezzevole brezza
che corri lieve tra i fili d'erba
e i miei capelli e dolcemente 
disperdi il filo del discorso.
Ricerca (1° ottobre 1996, ore 1:12)

Tra le coperte del letto avito
nell'incerto lume del mattino
o tra le ariose stanze
della paterna casa;
fra le ombre e gli echi del focolare
o tra le gioie e i drammi del mercatino;
nella folla scomposta
o nelle notturne strade cittadine;
fra le nostre valli silenziose
e i venti discreti sulle romite vette;
o tra le fulgide stelle delle notti d’estate
io ti cercherò, papà.

O tra le pallide pietre del cimitero.
In auto (22 ottobre 1996)

Ruggiva riottoso il giorno morente
e il mondo stupiva prima del buio.
Iroso, i monti ammoniva e nel cielo 
sperdeva le pavide nubi e già
incalzavano lontano da oriente
fulgidi astri che spegnevano il fuoco.

Forte batteva il mio cuore
e rapida l'auto correva.
E tu padre mio, che sorridevi
e guardando lontano dicevi:
Andiamo verso il sole!

Ovunque ti avrei seguito, papà
ma sei partito da solo.
L'uomo sulla montagna (autunno 1996)

C'è un uomo sulla montagna,
fra l'erba rugiadosa striscia
l'ultima notte
e in fondo alle valli scivola.

C'è un uomo sulla montagna,
nelle nubi basse, fra le valli, 
ascolta la terra madida,
i dirupi assorti.

Ombra fra i vapori,
miraggio del mattino.
A volte vado a trovarlo,
piangiamo insieme 
il nostro destino.
Spettro (1997)

Stendono gli ampi artigli
le tenebre predatrici.
Foschi monti osservano,
perversi incappucciati.
Affretto i miei passi,
paura mi assale,
terrore di non tornare.
Nubi maligne si insediano scaltre.
Allungo il passo, abbasso lo sguardo,
m'affanno a consumare il sentiero
che quasi scompare.
Alberi neri oscurano l'aria,
stendono i rami, mani insidiose.
Rumori alle spalle mi tormentano,
non oso voltarmi. 
Sussurri tra i cedri,
sghignazzi fra i rovi,
da dietro veloce qualcuni m'insegue.
Accelero il passo, voglio fuggire.
Ma sgomento maggiore m'assale;
m'arresto, il petto tumulta,
un brivido forte mi scuote:
sospesa davanti un'ombra mi sta;
immobile, gobba, avvolta
in un nero sudario m'indaga.
Assorta mi sfida.

"Vegliardo o demonio che sia,
spettro maledetto, vattene via!"

Le gambe mi portano salvo oltre il colle,
intanto il corvo, sonnolento, scuote le ali
e in cerca di un più tranquillo ramo vola. 
Ninna nanna (1997)

Dormi piccolo tesoro
che vien la notte dolce 
dalle stelle d'oro,
(ma altrove ancora alto è il sole).

Dormi piccolo tesoro
che la mamma ti protegge
accarezzando i tuoi riccioli d'oro,
(ma la fame ghermisce altrove piccole prede).

Dormi piccolo tesoro
che il morbido guanciale il capo regge
e sogna del felice bambino d'oro,
(ma il gelo accarezza altrove deboli corpi).

Dormi piccolo tesoro,
alza il lembo sulle rosee guance,
chiudi gli occhi al dolce coro
che passa la morte
ed altrove le sue mani cala.
Anime (15 gennaio 1999)

Il sole taglia lo sguardo
liquida sfera,
il pozzo si stringe sorpreso.
Fluttering,
si danno e no 
le remiganti al barbaglio,
è solo un attimo.
Il picco schernito?
Quello è il ricordo
anche per noi.
Vedi?
Non stanno sospese 
a guardarci. 
Caprioletto curioso (inverno 1999)

Caprioletto curioso
tormento delle rupi
vecchi induriti
degli anfratti scontrosi.

Ombra soffusa, verde cupo.
In vivide macchie
la luce indaga
i tessuti di una foglia novella,
nel ronzare di un'ape si sfrangia,
lampeggia un istante
nella liquidità dell'iride.

Ora ti vedo sereno al lavoro, papà
tu grande
io piccolo, al cospetto.
"Mamma mi ha chiesto il timo!"
Meditato il rimprovero
in una smorfia si scioglie, in un sorriso.

Ti stendo Paoletto
tra le piume di quei giorni.
Esterrefatto, lancinante
vi bacio nel sogno
voi tre.
Quadro del bisnonno Pietro (inverno 2000)

Riflessi sul fondo
di uno specchio d'acqua
o flusso sotterraneo
di sangue
quel morbidissimo panneggio
annebbiato dal lutto.

Tante dita sottili
gettate affrante su quel capo
i capelli.

Testimonia indiscutibilmente
una esistenza
quel volto.
Malattia (aprile 2003)

Guardando il soffitto
stillano lente le ore,
come l’ultimo sangue
di una gola recisa.

Respingo e accarezzo
le lusinghe continue
di una penna lucente,
un coltello.

Sfogo a volte
per strada di notte
l’angoscia immobile
del giorno.

Interrogo la sera i lampioni.
Carezzandomi con pallida luce
mesti mi dicono
‘non guarirai’.

Con un lumicino di speranza
sempre disattesa
sopporto la vita
tra una visita e l’altra.

Invano il male esorcizzo
con formule arcane,
i nomi misteriosi
delle medicine.

Sfoglio i giorni
a centinaia,
come pagine insignificanti
di un’agenda
senza memorie.
Convalescenza (aprile 2003)

Malati e inconsistenti tepori
poi inverno di nuovo
per giorni.
Ogni anno una lotta
in sordina.

Così la salute per me.
Solo tardi ho voluto capire
che un succo dolcissimo
mi era concesso.

Le lucertole mi insegnano ora.
Quelle vecchie
che conoscono il gioco
e quelle novelle
sbocciate l’estate.

Da campi nascosti
bevo avido il primo sole,
sulle rocce mi riposo
placido e stanco
come un anziano.
Incredulo ammiro i colori
del mondo ritrovato.
Alberi (4 novembre 2004)

Quanti autunni sono venuti
con il loro fresco tonificante
a darmi sollievo?
Cosa resta dei cieli d'autunno,
dello scricchiolare sotto i piedi
delle lacrime brune dei platani?
Degli acquazzoni che gridano
che l'estate è finita,
del tempo vissuto
con i miei genitori
cosa mi resta?

Conservo forse le parole di mio padre
quando lo seguivo, lupetto curioso,
nel buio sottobosco della villa?
Un istante vivo di quei giorni
non mi rimane.

Ho scoperto cosa c’è negli alberi
che ci affascina.
Loro sono i nostri morti
che  quietano i cuori
con il coro delle voci
dei mille rami dei mille anni
della nuova vita nutrita 
dalle vite dei mille padri,
delle madri,
dei mille figli e sposi
per i cuori smarriti
che stillano lacrime
per le cose che ogni giorno
ci scorrono fra le dita.                                     
L'uomo di neanderthal (4 dicembre 2004)

Forte, buono
ora anche bello
il neandertaliano
per i paleoantropologi.

Scienziati canuti
invecchiati in un museo
a fissare le orbite vuote
degli antenati
ritrovano pallide luci dell’adolescenza
sogni di esplorazioni
e di scoperte.

Emerge un ricordo tenero
il padre che da tanti anni
non rientra più a casa
dopo  il lavoro
e sono di nuovo bambini.

Come fare a parlare
dell’uomo che più hanno amato
dell’uomo migliore del mondo
senza piangere
senza dare sospetti?

Caro neandertaliano
hai conquistato le terre fredde
della mia mente.
Sei il pensiero più bello
e pulito
che abbia mai avuto.
La mamma (20 aprile 2005, ore 22:15)

Un volto più caro
più noto del tuo
c’è stato mai?
Occhi più dolci
corpo più caldo
braccia più forti
per stringermi
le ho mai conosciute?

Sciogliere nell’acqua
i colori del tuo viso
come il pigmento
come ho potuto?
Dimenticarti per sempre
scomporre
i tuoi lineamenti
confonderli come nei puzzle
di quando ero piccino
perché?

Ti ho fatto morire
anche nel ricordo
per non dover soffrire.
Viaggio impossibile (2006)

Contro le correnti del Tempo
maestose
severe mi scuotono
ma cedono gli eoni

paurosamente incombono
i divieti infrangibili
a stento schivo
i no imperiosi
lambendo con un brivido
le vallate sospese
delle paure congenite
risalgo con sforzo le Leggi
trepidante mi godo
il silenzio attonito

forse sarò il primo
schianterò
tra un battito e l’altro
il divieto ineluttabile
scivolerò oltre
su una sospesa vertigine

e ti rivedrò.
Paleoantropologo (19 maggio 2007)

Una vita invecchiata
dietro le ossa
a far combaciare frammenti
di volti sottratti alla pietra
che ne chiuse le gole
quando era terra

comporre e scomporre
con dita veloci
di giovane uomo
misurare e descrivere
con la sicurezza dell’uomo maturo
lasciando infinite stagioni
oltre la finestra
dietro le spalle

per ritrovare poi vivo
solo alla fine
nel riflesso di un vetro
il viso tanto cercato

quello del padre
che da una sera
di tanti anni prima
non rientra più a casa
dopo il lavoro.
Genesi 3,14 (17 dicembre 2009)

Eva amata candida figlia
e tu Adamo dolce speranza
ascoltate

nel tempo prima dei tempi
prima che foste anche solo pensiero
quando tutto abitava in me solo
prima di Eden e degli altri infiniti giardini
che vi ho riservato oltre la cortina cangiante del cielo
prima di tutto volli svelare
della gioia il volto segreto
non per me
ma per dare alla luce creature
che mi fossero grate di respirare

trarle dal Nulla non posso
pensavo
se poi non sapessi farle felici

tenere fronti dolci capi
il vostro intelletto l’anima vostra può prosperare
oppure appassire e languire
a voi sta stimolarli
io vi spiegherò come

sapete dirmi perché gli uccelli sanno librarsi
mentre le stelle cadono giù?
Eva coraggio! Adamo dimmelo tu
non lo sapete lo so
ho voluto così
dovrete scoprire ogni cosa
e nel farlo la mente incerta si accrescerà
con fatica senz'altro ma con somma soddisfazione
avrete il potere ma lo dovrete strappare
perché ho previsto una legge per ogni cosa
le ho scritte in filo d’argento e poi le ho nascoste
perché le cerchiate

il potere strappato camminando sul ventre
mangiando la polvere ogni giorno
è l’unico di cui si possa godere
questo è il segreto di una vita felice

ma attenti!
non dovrete mai languire!
il sonno vi trovi operosi
poiché nel morire da vivi non c’è nulla di male
piccoli miei
l’unica sventura
che in questo mio mondo dovrete evitare
è che viviate da morti.
Nessun messaggio nuovo (2009)

Trecento milligrammi
quattrocento, o niente.
Polvere fine
in capsule d’ostia
o gocce benedette
di fiale ambrate.
Mi affido al pantheon
della farmacopea:
Risperidone padre celeste
Sertralina sua sposa
Trazodone dio dei mari…

Assidua presenza
l’ostinazione del cellulare
e del computer
senza nessun messaggio nuovo.
E la speranza frustrata
di mordere i soccorritori
come un animale ferito.

Le tracce non ritrovo
in questa stanza
della guerra
tra la rabbia e l’impotenza.
Il cranio ne è il teatro
mille e quattrocento grammi
di cervello sfibrato
le rovine.

Tutto quello che rimane
adesso
è il desiderio di rivivere
un giorno
da essere umano.
Come quando
da bambino
ogni giorno
era una vita intera.
Oggi (13 ottobre 2010)

Generazioni nascono e muoiono
e a restare di noi
sono solo atomi
di azoto e carbonio dispersi
nei sussurri anonimi
delle piante e del vento
nel gorgoglio delle acque
le voci di miliardi di anime
senza memoria.

Il passato fluisce
in un pozzo che non c’è
il futuro non ci appartiene
e per morire ce ne vuole
di pazienza più di quanta
se ne abbia avuta mai
per vivere e di denti
da stringere
per chi resta.

E allora dillo adesso
che gli vuoi bene
e non risparmiare le forze:
la vita non può essere
un’abitudine
perché oggi
è tutta la nostra vita.
Oggi
Senza vagiti (2 novembre 2010)

Quello che ho trovato
oltre la porta non eri
più tu
tu non eri
già più
familiare
e completamente alieno

dimentico ogni volta
ma busso e aspetto
davanti a quella porta
sono morto
e sono nato
allucinato
attonito un neonato
già adulto
senza vagiti

ma dove sono?
nella mia città?
e dove altro

adesso sono
veramente solo
con la tua giacca
di fronte all’Inverno.
Sindone (14 novembre 2010)

Quanta sofferenza
il flagello e le percosse
e quanto è dura a morire
sulla croce

questo ti hanno fatto
gli uomini
ma in fondo te la sei cavata
con poco in poche ore
te la sei cavata

noi uomini non siamo
così fortunati
malattie bizzarre e crudeli
giovani menti perdute
nella psicosi
e bambini sepolti
dai capricci della terra

questo ci fanno
le divinità
e mille stigmate
sono solo dei graffi
qualche miracolo
un’ingiustizia

non è che una goccia
la tua sofferenza
una voce
in miliardi di grida.
Lacrime (7 dicembre 2010)

Tra le circonvoluzioni
di quel velluto morbido
che diciamo tuttavia
corteccia
il tessuto deve aver ceduto

o più giù nella trama
impossibile di dendriti
che ci piace chiamare
cuore
di rami e di radici
come frattali
qualcosa si è spezzato

Forse nel nucleo antico
il tronco encefalico
deve essersi incrinato

perché dalle sorgenti nascoste
non nascono più
le lacrime.
Sepolcri imbiancati (7 dicembre 2010)

È caduto l’ultimo velo
e fisso attonito il vuoto
oltre l’ostinata finzione
delle chiacchiere sul tempo e la partita
il nuovo romanzo
di cui non si vede il bisogno
i pettegolezzi e le mode
i vuoti rituali dei sacerdoti
tutto quello che fate per non vedere
la futilità degli scopi la fragilità
della vita

i giocattoli degli adulti
sepolcri imbiancati le auto e le case
gli indumenti più scomodi che utili
e l’affanno per le cose da sfoggiare
per i piaceri di cui non abbiamo bisogno

tutto per scordare
ciò che già sapevamo
perché hanno ragione
i bambini e anche io
ho di nuovo paura
del buio.
Sepolcri imbiancati
Tempo (8 dicembre 2010)

Si ferma il tempo
per tutto il tempo che vorrò
sono solo
un bisbiglio tutte le voci
del mondo e il mondo
non corre più sul suo filo di seta

una biglia colorata
su una pista di giganti
ma anche una macina grave
sul suo asse che macina
i giorni oltre i millenni
per millenni
migliaia di vite a ogni giro
da sempre e per sempre
perché?

si ferma il roteare delle stelle
per tutto il tempo che vorrò
sono solo sulla strada
che non ritrovo
casa
con il moto della terra
e del sole e della nostra galassia
non siamo più nelle regioni dove siamo
nati
per il roteare delle stelle
rispetto a cosa?

pensiamo di restare
fermi sotto una quercia
e non è vero
schizziamo nel nulla
senza sentirlo
perché il moto è inerziale
e questo ci inganna

si ferma il tempo in questa stanza
siamo soli
per tutto il tempo che vorrai
il giorno e la notte uguali
con il respiro sospeso
la neve non si scioglie
al sole.
Tempo
Primati (9 dicembre 2010)

Lo volete sapere?
siete primati
con l’abitudine curiosa
di indossare vestiti
sì!
di scimmiottare gli dèi
fatti come voi
da voi
perché fosse più facile
già!
quel vegliardo che è in ogni cultura
e quell’Apollo di trent’anni
al quale cambiate sempre il nome
e la mamma
che ancora vi allatta

ma poi perché
li invocate
quando vi ammazzate a vicenda?
con il metallo
la combustione
o i giocattoli atomici
che vi sembrano chissà cosa
simboli fallici
di maschi aggressivi
più dei gorilla
che fanno un gran chiasso
ma sono buoni

non vi vedete?
camuffati
col doppio petto
e lo smartphone
ma con le scarpe di pelle
ancora le pelli indossate
delle vostre prede
travestiti da dèi vi distinguete da chi?
dai primati?
non credo

sapete cosa?
Dio è il maschio alfa
e lo venerate
lì siete rimasti
e se qualcuno lo nota
gli fate il grugno.
Primati
Disegni (15 dicembre 2010)

Una notte si fermerà la sveglia
e per me sarà finita
una foglia vive solo un’estate
e nessuno la ricorda
nel lavorio dei batteri
divide con la neve la stessa sorte

e allora verso le lacrime
in una bottiglia
e tutti i battiti del cuore
li affido al mare 
i miei quattro disegni senza valore

è come una magia
la luce dello scanner
e in un lampo sono cifre i miei pensieri 
uno e zero
la solitudine e il nulla
bit
il canto di una cincia
fra olmi e  faggi di nessuno
nel bosco che valica gli eoni

e se fra mille orbite 
o mille volte mille dei cicli 
che ci sopravvivono da sempre
un archeologo saprà ricomporre
una sola sequenza
di numeri binari
allora tra le pagine di un libro
una foglia si sarà salvata.
Disegni
Lascaux (16 dicembre 2010)

Lo immagino su una roccia
seduto con il mento in un palmo
per cento e più dei secoli
della nostra storia

immagino che si sia commosso
il Tempo per una volta
nelle stanze intime della terra
ha fermato i giorni a quel giorno
che l’ultimo dei pittori
lasciò un disegno
e portò via i suoi colori

sono ancora lì i cervi megaceri
non si sono estinti i mammut
in quelle grotte
un fiume perduto si è conservato
ecco, lo guada un gruppo di renne
per sempre
e l’altra sponda non arriva mai

immaginate che mi sia commosso
seduto con il mento in un palmo
sulla riva di quel fiume
il mondo non si è perduto

la terra ha chiuso da tempo gli occhi
di quegli uomini
ed è diventata pietra
eppure ho visto l’ultimo dei pittori
guardare il suo lavoro
seduto con il mento in un palmo
è ancora lì
e diecimila anni fa
non ha portato via i suoi colori.
Lascaux
Autunno (25 dicembre 2010)

Avevo vent’anni
sulla cima di quella parabola
un acrobata incosciente
come quando da bambino
seguivo nostro padre in cantiere
troppo felice
per guardare in basso
così veloce il pensiero
da non poter stare fermo
troppo bello il cielo d’Autunno
per rinunciare a toccarlo
tardi
per non cadere

avevo vent’anni
e ne ho avuti cento
precipitare è così facile
è così bello lontano
dal cielo
un angelo triste mi ha vegliato
senza parole senza apparire
nella selva di Dante
c’ero davvero
tra le conifere immobile
in attesa che indietreggiasse la notte
hai fatto più tu di tanti abbracci di carta
hai detto di più di tanti saggi a noleggio

essere non apparire
hai lasciato su un faggio
perché lo trovassi
quando non ho trovato che un corpo
quando fosti sicuro
che avessi ritrovato me stesso

tardi per volerti bene
poco due versi
per la tua vita
troppi danni per riparare
troppo grave da concepire
fuori da questa selva abusata
ogni stella sarà appannata per sempre.
Libri (9 gennaio 2011)

Chiusi
come le donne dei soldati
aspettano monoliti austeri
lontani
come i ritratti degli antenati
mi osservano da anni
esercito di statue
foglie
di vecchi sogni dispersi
sui tavoli corpi
di un’antica battaglia
quando tutto sembrava possibile
con il potere dei libri
bastava volere
governano il mondo
le equazioni differenziali

volavano le pagine
al vento dei vent’anni
la notte solo una candela
e l’immobilità d’un geco
e posso dire senz’altro
di aver vissuto per sempre
al vento dei vent’anni
disperderei i miei trenta
per un altro giorno per sempre

aspettano come la donna
del soldato un crociato
che non torna
e Penelope forse
questa volta
ha chiuso l’ultimo nodo

per favore cercate
un geco e una candela
un ragazzo bizzarro
sotto un cappuccio
un piumino troppo corto
guardate la manica destra
se è rammendata
ditegli che ancora lo aspetto
da anni
non ho chiuso l’ultimo nodo.
Mattino (13 gennaio 2011)

come una minaccia
l’anima diafana
che preme da fuori
in attesa di qualcosa che non voglio

all’afelio di una lontanissima orbita
prima
mi scopro in una stanza
ora
emergono i libri affiancati sulle mensole
statue marziali
di qualche antico ordine
di cavalieri severi
maestri
infallibili e disumani
montagne senza vetta

il mattino convalescente
cerca i colori della salute
chiede
di essere vissuto
chiudo
gli occhi e mi rannicchio
c’è ancora tempo
non si incarna
il giorno è ancora solo
un presagio
Unità di misura (09 gennaio 2011)

Prima della sveglia
quando la veglia
incalza gli ultimi sogni
e la memoria li rifiuta
questa mattina
si fa avanti una nube confusa
delle voci che ricordano qualcosa
visi famigliari che ho visto
ma dove?

il popolo delle unità di misura
moltitudine incerta
di profughi dispersi

il joule e l’erg si guardavano affranti
indecisi se abbracciarsi o no
incapaci di ricordare
il rapporto che li legava
il loro coefficiente di conversione

invano il tesla
cercava di afferrare il secondo
che schizzava sconvolto
mentre il volt teneva stretto l’ohm
che offriva resistenza con tutte le forze

e se il cavallo vapore provava disperatamente
a disarcionare il watt
il corpulento chilogrammo peso
subiva in silenzio
l’aggressione verbale del newton e la dina

ho visto poi il bar e il pascal
vagare disperati sulle tracce del torricelli
e la mole arrancare
dietro la nazione vociante delle costanti fisiche
numeri senza nome e senza misura
popolo di terremotati che cerca le proprie case
dopo il cataclisma.

Sarà capitato anche a voi
di cercare le mattine di pioggia
in aula nella memoria
quante giornate
le illustrazioni dei libri di storia
le penne a sfera e i raccoglitori ad anelli
i compiti in classe
quanti temi e quanti esercizi
più importanti del resto del mondo
tutto il mondo allora
quanto poco adesso.
Punto e virgola (11 gennaio 2011)

ibis redibis
non
morieris in bello

una virgola
è tutto la differenza
fra vita e morte
condanna o speranza
basta un segno
a cancellare i sogni
ma se il destino è in versi
ciascuno legge
il futuro che vuole

prospera la poesia
su questa ambiguità affastella
più significati su un significante
togliendo le virgole
spezzando il discorso
il volo di una farfalla
che va da una parte
ma poi ci ripensa
traccia più direzioni
e le lascia lì
ognuno raccoglie
quella che vuole.
Infanzia (1 aprile 2011)

Ricordo i miei amici
come erano allora
i bambini che sono stati
quando restammo
sulla soglia dell’adolescenza
con il viso rivolto indietro
segnato dalla terra e dal sole

giornate di caccia alle rane
boccate di vento in bicicletta
sgridate per il ritardo alla cena
per le scarpe rovinate
pedalate memorabili
camere d’aria bucate
graffi e ginocchia sbucciate
micetti e ciotoline di latte

viaggi epici ai confini del mondo
assaggio precoce di libertà
a un passo da casa
inebriati e spaventati scoprimmo
l’abisso di un mondo più vasto
lontano da mamma e papà

mi rivedo perso con loro
tra colonne di pioppi sotto le volte
dell’albero che si dice del sole
tirato dai rovi marcato
dal succo acre delle graminacee ferite
eccoci persi in un passo favoloso
cimitero di megaliti assorti
pelle di muschio e rughe cadenti
fondali induriti di un mare scomparso
in sudari tessuti
con un popolo morto di simbionti
le infinite anime calcaree dei bivalvi
molluschi addormentati dai vagiti del mondo

naufragammo
in un mare d’erba che arriva alla vita
sulla schiena ripida
di un monte grandioso regno dei venti
mi chiamano
ma turbina l’aria e non li sento
in una distesa pettinata dal vento
si sono disperse le nostre vite.
Agenda (20 luglio 2011)

Nascosto come un topo
rannicchiato
tra vestiti sparsi libri resti
dei tentativi di evasione
dal vuoto
che ovunque tu vada
ti rimette al centro
che razza di gioco

la spada non serve la forza
il nemico è oltre lo specchio
dietro quegli occhi cerchiati
ci sei tu
l’impegno e la volontà
non valgono più
le regole sono diverse qui si cerca
il tesoro
la formula magici infiniti
da ripetere all’infinito
provare aggiungere togliere
cambiare combinare
sperare
disperare

si ferma il tempo sulla strada
sei una lancetta indecisa
apri il fiume di gente
che si richiude e non ti vede
un giocattolo di latta
non può ricaricarsi da solo

si ferma il tempo in questa stanza
resti solo resta
una penna esaurita
sulle pagine di un’agenda
senza memorie.
Agenda
Mente (13 settembre 2011)

Tre compresse al giorno
e ci vediamo tra un mese

di mese in mese e negli anni
dimenticasti com’era
a ritrovarla
senza di lei
non ce l’hai fatta
a rianimarla
con la tecnologia
ne hai confuso le orme

per gli altipiani
di fossili
in Etiopia e tra le formule
dietro al futuro si perse
tra le pagine a settembre
a vent’anni
gli unici giorni
che tu mai abbia vissuto
all’inizio di un libro
chiuso da allora

la luce non viene più
dell’alba
dalle imposte o lo scroscio
dei temporali
lo stesso giorno
da anni deteriorando
ti dicono

ma ti avessero detto che si perde
come i sogni al mattino
oltre lo specchio mille volte
la rivolevi com’era
splendente a vent’anni
dopo un brutto sogno
la tua mente
per sempre.
Oscillazioni

Schianto
di specchi
in costellazioni disperse
di carapaci
di vetro
di blatte
sorprese dalla luce
alla fuga
il pensiero

oppure
ombra mefitica
d’un sauropode stanco
nella camera chiusa
da mesi.
Oscillazioni
Clinica (18 novembre 2011)

Ti trovo meglio

ogni volta
voglio crederci
che io non me ne accorga
ancora
il richiamo del carrello dei farmaci
e tutti in corridoio ammaestrati
rassegnati con i palmi a scodella
condomini muti
ci guardiamo a vicenda
diffidenza
convivenza forzata

reparto chiuso in attesa
richiamo delle chiavi e della porta a vetri
tutti fuori
nel giardino in gabbia
la macchinetta del caffè
un rituale che non stanca
è il sangue di un dio pagano
l’eucaristia che rassicura
acqua e sapore di quotidiano
nero però
succo degli incubi di tutti noi
di chi non uscirà mai
di chi non uscirà più se stesso
diverso qui
qualcosa si è rotto.
Ulisse (18 febbraio 2011)

Si squarcerà lo Spazio
resterà a guardare
il Tempo in un angolo
coprirà il grido con il sudario
muto
fra i grugniti dei Proci
come topi sorpresi
dalla luce fuoco
negli occhi la rabbia di anni
umiliata con le catene
fruste adesso
vortice chiuso in una stanza
troppo a lungo
perché un animale
non diventassi alla fine
per sopravvivere così
un uomo non si può essere questo
non è un uomo.

Getterò il mantello
l’ombra
delle strade notturne
mimetismo dei fantasmi perduti
quanti siamo quanto soli

A terra gli stracci
onda d’urto
mi riconoscerete con un brivido
e sarà tardi.

Troppi anni in gabbia
a leccare le ferite
troppo a lungo da dimenticare
di essere un uomo
avete dimenticato che lo fossi
quello che fui lo avete gettato nella torba
in un giorno
e dalla torba il turbine terribile represso
sarà una tempesta

Un giorno ma non ora
lecco ancora
le ferite le catene
di ferro sono maledette ancora
cerco invano la mattina la chioma
di Sansone
tra i capelli che cadono
scandendo gli anni.
Spazzatura

Affacciato sul mondo disperato
del cassone
nel pattume ho rivisto i pazienti
di una clinica senza dimissioni
popolo perduto
lasciato a invecchiare in un giardino

pannolini lordi amorevoli balie
mante albine
hanno donato il candore
per finire così
in pasto al termovalorizzatore
tutto il loro contributo ora
è il calore
di una combustione veloce

un paio di scarpe malinconiche
usurate e stanche
vecchi tonni spiaggiati
aspettano senza proteste
il prossimo carico
nella massa mefitica
banchetto osceno
dei batteri saprofagi

e questa bicicletta
inghiottita
ha chiesto che provassi
a salvarla le risparmiassi
la sofferenza gratuita
di anni di discarica
non si augura a nessuno

un paio di pedali nuovi
per ricominciare
una spugna per detergere
i brutti sogni e tutti i peccati
sono rimessi adesso
non c’è altro da scontare
lubrificante ai cuscinetti
perché la vita non sia più
solo una salita nessuno merita
di morire da solo.
Luce (dicembre 2011)

Che mondo è?
E che devo fare?

Un atleta consuma da solo
il fabbisogno quotidiano di cibo
di un gruppo di Masai.

Un’auto brucia sull’asfalto
in poche curve
tanta energia
quanta un bue sui campi
ne spende in una vita di lavoro.

E un flacone di crema
di quella per le rughe
costa come una campagna di vaccinazione
per un villaggio remoto
dell’India.

Accendo la televisione
e non ne posso più
di oggetti che non servono
di presentatori ruffiani
di showgirl che stringi stringi
praticano sempre la stessa arte
in quel mondo di cartone
che non è la poesia
ma si chiamano artiste
e di muscoli esibiti
nutriti con chili e chili
di carne sciupata

di telegiornali sui pettegolezzi
di servizi sui parrucchieri dei gatti
di applausi come temporali per scemenze
nei talk-show e uguali ai funerali
di shampoo antiforfora
e detergenti così forti
da uccidere tutti i germi
senz’altro
ma insieme a un intero ecosistema

di confezioni di antidepressivi
il cui prezzo fa arrossire
se dei bambini non hanno nemmeno il latte
in popolazioni che sono alla rovina
con il sorriso sulla bocca

di conti esorbitanti dal dentista
per riparare i danni di un’alimentazione
abnorme
spendiamo più di quanto abbiano tanti
per un’alimentazione che sia
almeno sufficiente.

Facciamo studiare i giovani
oltre i vent’anni
quando un abbecedario è un lusso
per i bambini col fucile sulla spalla.

Uno blu
e uno verde
io non li butto
e con questi due accendini
proviamoci
a illuminare tutta la vita
che ci rimane.

Sono un ambulante
che ha incontrato questa sera un ambulante
che mi ha regalato una cosa
che io ora vi passo.
Luce
Palestra (23 febbraio 2011)

È sempre buio
all’inizio
si comincia sempre da zero
si ricomincia
cerco l’interruttore
aspetto il ritardo e l’incertezza
dei tubi al neon

la luce non basta
dormono ancora
enormi ragni cromati le macchine
catalogati per massa
i dischi neri sogni
di ferro e carbonio
manubri e bilancieri

sonno pesante di ghisa
silenzio di sfida
si comincia
fisso il peso aggiungo
pesi che tintinnano
come bicchieri di cristallo
sfiancano
come sogni di piombo

espiro e tiro con tutta la rabbia
inspiro e mollo
piano però, non è una sconfitta
e comincia il ballo del ferro duello
con la carne
è più forte la volontà
sotto l’acciaio non soccombe

soli in due io e quel tale
oltre lo specchio
l’illusione di sollevare ogni problema
di ricominciare da zero

è sempre buio
all’inizio
si è sempre soli.
Stelle

Perché vivi male?
Perché mi vergogno
E di cosa?
Di aver vissuto male

Allora apri la finestra
e ricomincia
perché una vita si riscatta
anche l’ultimo giorno
e non rassegnarti
il grigio non è una fatalità

sii più grande
del muro più grande
della vita stessa
le stelle non sono solo da contare
e se impegni la tua vita
ottieni l’oro delle stelle

non guardarti attorno
perché si gode il viaggio
quando per goderlo
non si ha il tempo
avrai tempo per riposare
tutto il Tempo quella notte
che non metterai la sveglia

i tuoi occhi
non dare per scontati
la lucidità e le gambe
perché tanti non sono così ricchi
e darebbero la vita che resta
per un giorno ti giuro
di quelli che hai sciupato
e l’ultimo giorno non è tardi
se la mano trattiene ancora le stelle
c’è tutto il tempo

è vero
siamo solo uomini
non siamo titani
né dèi ma dei giganti
siamo proprio per questo
e se fallisci hai vinto comunque
perché hai fallito se non hai tentato
e forse la salita
già per se stessa è la meta.

Ricordati
che se il desiderio è sincero
Dio
mi disse un aviatore
ci fa desiderare
solo ciò che possiamo avere.
Stelle
Tram (9 gennaio 2011)

acquario
utero d’acciaio
una mamma gravida
cuore
di magnete sangue
di elettroni
ape regina di larve
nidiata numerosa
di monadi mute

rimugino mastico
le parole con la fronte
sul vetro
non può essere
così tutto qui
non può essere

cervice del ventre d’acciaio
pistoni idraulici
la dilatano
senza delicatezza
finisco fuori
dove vanno tutti quanti?
fermo sulla soglia
della quotidianità
rimugino mastico l’infinito
nascere
non è mai stato facile
La guerra di Lyme (15 aprile 2016)

Non è mai stata
Così piccola
La balena bianca
Balugina
In un mare tutto interno.

Sulle rive dell'Ellesponto
Serpeggiano gli Achei
Spirochete
Come pensieri insidiosi
Ha trovato l'inganno
Perfetto Ulisse
Le cellule dendritiche
Sono il mio cavallo di legno.

La barriera ematoencefalica
La Normandia.

Melville, Omero, F. Jacob
Le battaglie importanti
La storia le affida ai poeti.
Candida e nera 1.0 (15 aprile 2016)

Mi ricordo di averti seguita un giorno
Nel cuore del caldo
Dietro i bambini che si rincorrono
Ad Ur, i capelli neri e la figura snella
Sul baluginare dei muri imbiancati
Quattromila anni fa come ora
Indaffarata in qualcosa sovrappensiero
Ti infilavi in un uscio.
Ero lì, tra i buoi candidi 
Che sfilavano pigri, divinità estinte
Di una Mesopotamia da migliaia di alluvioni
Sepolta.   

E sono sicuro di averti vista 
Nella tua auto, un pomeriggio di pioggia
Tante generazioni dopo di questa
In città, su un pianeta che non è il nostro
Intorno a una stella ancora senza nome
In un ramo della galassia.
Spigolosa e tenera, candida e nera
Il volto eterno della ragazza senza etnia
E senza epoca.

Gli zigomi larghi raccontano di popolazioni
Che inseguivano migrazioni epiche dall’Est  
Di ungulati seminando
Commerci e guerre, altari e cimiteri.
La fronte ampia preserva secoli 
Di civilizzazione, matematica e filosofia 
Dei pascoli dell’Attica
Sotto il sole di Omero.
Sono arabi i capelli, hanno visto l’Africa del Nord
Gli occhi scuri ma luminosi
La caduta delle mura di Cartagine.
Sigilla storie anonime di amori vissuti
Tra papi e soldati, nei vicoli di città operose
O nelle campagne immobili del Medioevo
La bocca.

Un viso che racconta una storia
Quella dell’Uomo, le luci epiche e le tenebre
Di questa avventura favolosa
Candida e nera.
La retta e il punto 1.0 (20 novembre 2018)

Avevi dieci anni in vacanza 
con i tuoi tu di me non ti ricordi
ma ero lì in Egitto di passaggio
per gli altipiani di fossili, la terra 
degli Afar.

Ti vidi e seppi di amare 
la donna che saresti stata
e allora pregai la dea nera
i fianchi bruni che cullano 
il mondo.

Siete separati da troppe stagioni
non si può – mi disse – la legge non vuole.
Avete solo una donna nella vita 
dalla culla alla tomba di volto in volto
sono sempre io, dovresti saperlo.
La troverai con un’altra voce, dimentica
il suo nome.

Ma io pregai fino a farmi del male
la sedussi con l’arte che non pensavo 
di avere e le strappai il patto terribile
che sarei stato una statua pur di poterti 
amare. Tutto questo viaggio 
immobile qui l’ho fatto solo 
per te.

La dea ammonì che il tempo per me 
non avrebbe ripreso e nel momento 
in cui ti trovo ti perdo, resto indietro. 
L’incontro dura l’intersezione 
di una retta con un punto, tu devi andare 
e io sorrido oltre il presagio liquido
del pianto.
L-Val 1.0

Io scordarmi di te?   

La spia sotto il cappottino  
che attraversa trafelata 
il cortile del condominio 
oltre il diaframma della porta
come un'attrice 
che dopo un'esitazione 
esce dal film, dalla cornice 
della sua recitazione
e mi misura dai piedi ai capelli 
che si siede sul letto che tenevo 
in sala ed è sola, persa
in un dolore che spera 
io già conosca immersa. 

Oppure la fanciulla elegante 
con i pantaloni larghi  
che imitano la gonna l'istante
che si ferma una sera d'estate 
da Piazza Re di Roma non distante. 
In Villa Celimontana, fiore patavino
tra le foglie oleandre; 
e poi minuto corpicino 
che mi fa sentire grande
nel riflesso del finestrino
sulla metro seduta affianco   
alla mia camicia azzurra 
tirata dal petto. 

Dimentico tante cose, 
ma questo no, prometto.
Titus Lucretius Carus, On the Nature of Things, V 529-533  (2022)

This is the subject of my teachings, and I go on to describe
all the possible causes of the stars's movement across the Universe.
Of these hypotheses, only one must be the right explanation,
but what animates the bodies in the sky is still beyond the grasp
of those who move at an honest pace through the path to Truth.
Candida e nera 1.2 (luglio 2022)

Mi ricordo di averti seguita
quel giorno nel cuore del caldo
dietro i bimbi che si rincorrono
capelli neri, figura snella 
ad Ur, sul baluginio dei muri
quattromila anni fa come ora
indaffarata in qualcosa
ti infilavi in un uscio.
Ero lì tra i buoi candidi
pigre divinità ora estinte
in Mesopotamia da migliaia
di alluvioni ormai sepolta.
E sono sicuro di averti vista
in auto, un pomeriggio di pioggia
tante generazioni a venire
in città, su un pianeta lontano
intorno una stella senza nome
in un ramo della Galassia.
Spigolosa e tenera il volto
senza etnia della ragazza
e senza epoca, candida e nera.

Gli zigomi larghi di popolazioni
che inseguivano da Est migrazioni
epiche di ungulati narrano, 
commerci seminando e guerre,
candidi altari e neri averni.
La fronte ampia preserva secoli  
di matematica e filosofia 
dei pascoli attici di Euclide.
Sono arabi i capelli neri,
gli occhi scuri eppur luminosi
hanno visto a nord del Ciad l'Africa,
il crollo delle mura di Cartago.
Sigilla storie anonime di amori
vissuti tra papi e i soldati
nei vicoli di città operose
o anche nelle campagne immobili 
del medioevo d'Europa, la bocca.
Un viso che racconta una storia,
quella dell'uomo: le luci epiche
e le tenebre di questa avventura
che è favolosa, candida e nera. 
L-Val 1.2 (agosto 2022)

Spia sotto il cappottino
che attraversa trafelata
il cortile del condominio
e il diaframma della porta

oltrepassa come un'attrice
che dopo un'esitazione
esce dal film, dalla cornice
della sua recitazione.

Si siede sul letto in sala
sempre sola comunque persa
è in un dolore che spera
io già conosca, immersa.

Oppure fanciulla elegante, 
soavi vesti affusolate
che imitano la gonna l'istante
che si ferma, sera d'estate,
da Re di Roma non distante.

Sul Celio, fiore patavino,
oltre le foglie oleandre,
e poi minuto corpicino
vicino fa sentire grande
nel riflesso del finestrino

alla mia camicia affianco,
in metro, tirata dal petto.
Tante cose mi dimentico,
ahimè, ma questo no, prometto.    
La retta e il punto 1.2 (3 agosto 2022)

Avevi dieci anni in vacanza 
con i tuoi tu di me non ti ricordi
ma ero lì in Egitto di passaggio
per i fossili degli altipiani, 
verso la terra degli Afariani.
Lì ti vidi e seppi di amare 
la donna che saresti diventata. 

E allora pregai la dea nera,
fianchi bruni che cullano il mondo.
Siete divisi da troppe stagioni
non si può – disse – la legge non vuole.
Hai solo una donna nella vita 
da culla a tomba, di volto in volto
sono sempre io, dovresti saperlo.
La ritroverai con un’altra voce, 
dimenticati il suo vero nome.

Ma io pregai fino a farmi del male
la sedussi con arte che ignoravo 
di avere e le strappai il patto 
terribile che sarei stato statua 
pur di poterti amare un giorno. 
Tutto questo viaggio l'ho fatto solo,
immobile qui, per te tesoro mio.

La dea ammonì che il tempo per me 
non avrebbe ripreso e nel momento 
in cui ti trovo ti perdo, resto indietro. 
L’incontro dura l’intersezione 
di una retta veloce con un punto, 
tu devi andare e io sorrido 
dietro presagio liquido di pianto.
Libri 1.2 (24 settembre 2022)

Chiusi come le donne dei soldati
aspettano, monoliti austeri
lontani come volti di antenati
osservano, esercito di statue
foglie di remoti sogni dispersi
sui tavoli corpi d'antico agone
quando tutto sembrava possibile
col potere dei libri mi bastava
la volontà: governano il mondo
le equazioni differenziali.
Sono come la moglie del soldato
che aspetta un crociato che non torna
e Penelope forse questa volta
ha sigillato il nodo finale. 

Volavano le pagine al vento
dei vent'anni e nella notte solo
la candela e l'immobilità
d'un geco e posso dire senz'altro
di avere vissuto per sempre.

Per favore, sui terrazzi di notte
cercate un geco e la mia candela,
un ragazzo bizzarro e un cappuccio
di un piumino troppo corto, guardate
la manica destra s'è rammendata,
ditegli che lo aspetto ancora qui
e che non ho chiuso l'ultimo nodo.
Chiusicomeledonnedeisoldati
aspettanomonolitiausteri
lontanicomevoltidi_antenati
osservano esercitodistatue
fogliediremotisognidispersi
suitavolicorpid’antico_agone
quandotuttosembravapossibile
colpoteredeilibrimibastava
lavolongovernanoilmondo
leequazionidifferenziali
Sonocomelamogliedelsoldato
che_aspettauncrociatochenontorna
ePenelopeforsequestavolta
hasigillatoilnodofinale
Volavanolepaginealvento
dei ventannienellanottesolo
lacandelael’immobili
diungeco_epossodiresenz’altro
diaveregiàvissutopersempre
Perfavoresuiterrazzidinotte
cercate_ungecoelamiacandela
unragazzobizzaro_euncappuccio
di_unpiuminotroppo cortoguardate
lamanicadestrase_èrammendata
diteglichelo_aspetto_ancoraqui
echenonhochiuso l’ultimonodo
Agenda 1.2 (24 settembre 2022)

Nascosto come un topo, rannicchiato 
tra vestiti sparsi e tra libri, resti 
di tentate evasioni dal vuoto
che ovunque tu vada ti mette al centro
di questa perversa specie di gioco.

Non servirà la spada né la forza:
il tuo nemico è oltre lo specchio
dietro quegli occhi cerchiati ci sei tu
impegno e volontà non valgono più. 
Le regole sono diverse adesso 
si cerca il tesoro, la formula, 
infiniti da dire all’infinito:
aggiungere, riprovare, togliere
cambiare, combinare, poi sperare.

Ora si ferma il tempo sulla strada:
sei come una lancetta indecisa
che divide il fiume di persone 
che si richiude e non ti ha visto.
Eppure un giocattolo di latta
non può mai ricaricarsi da solo.

Si ferma il tempo in questa stanza
resti solo, resta una penna vuota
sui fogli di un’agenda senza note.
Nascostcome_untoporannicchiato
travestitisparsi_etralibriresti
ditentateevasionidalvuoto
che_ovunquetu vadatimette_alcentro
diquestaperversaspeciedigioco
Nonservilaspadalaforza:
iltuonemicoèoltrelospecchio
dietroquegli_occhicerchiaticiseitu
impegno_evolonnonvalgonopiù
oraleregolesonodiverse
Sicercail tesorolaformula
infinitidadire_allinfinito
aggiungereriprovaretogliere
cambiarecombinarepoisperare
Orasiferma_iltemposullastrada
seicome_unalancettaindecisa
chedivideilfiumedipersone
chesirichiudeenontihavisto
Eppureungiocattolodilatta
nonpuòmairicaricarsidasolo
Sifermailtempoinquestastanza
restisoloresta_unapennavuota
suifoglidi_unagen dasenzanote
Libri 2.0 (Roma, Settembre 2022)

Chiusi, come le donne dei soldati
aspettano, austeri monoliti
lontani come volti di antenati
osservano, esercito di statue,
foglie di remoti sogni dispersi
sui tavoli corpi d’antico agone
quando tutto sembrava possibile.

Col potere dei libri mi bastava
la volontà: governa l’universo
l’equazione differenziale di Newton.
Volavano le pagine, al vento
dei vent’anni, e nella notte solo
una candela e l’immobilità
d’un geco, e posso dire senz’altro
di avere già vissuto, in eterno.

Avevo vent’anni e ne ho avuti cento,
nascosto come un topo, rannicchiato
tra vestiti sparsi, tra libri resti
delle tentate evasioni dal vuoto
che ovunque vada mi rimette al centro
di questa perversa specie di gioco.
Sono come la moglie del soldato
che aspetta un crociato che più non torna.
E Penelope forse questa volta
ha già sigillato il nodo finale.

Non servirà la spada, né la forza:
il mio nemico è oltre lo specchio
dietro quegli occhi cerchiati, sono io.
Non valgono più, volontà e impegno, 
le regole sono diverse adesso
qui si cerca il tesoro, la formula,
infiniti da dire all’infinito:
aggiungere, riprovare, togliere,
cambiare, combinare, poi sperare.

Ora si ferma il tempo sulla strada:
sono come una lancetta indecisa
che divide quel fiume di persone
che si richiude senza avermi visto.
Ma si sa, un giocattolo di latta
non può mai ricaricarsi da solo.
Ora si ferma il tempo in questa stanza
resto solo resta una penna vuota
sui fogli di una agenda senza note.

Per favore, sui terrazzi di notte 
cercate un geco e la mia candela,
un ragazzo bizzarro, un cappuccio
di un piumino troppo corto, guardate
la manica destra se è rammendata,
ditegli che lo aspetto ancora qui
e che non ho chiuso l’ultimo nodo.
Libri 2.1 (Buenos Aires, 31 Dicembre 2022) 

Chiusi, come le donne dei soldati
aspettano, austeri monoliti
lontani come volti di antenati
osservano, esercito di statue,
foglie di remoti sogni dispersi
sui tavoli corpi d’antico agone
quando tutto sembrava possibile.

Con il potere dei libri bastava
la volontà: governa tutti i mondi
la legge differenziale di Newton.
Volavano, al vento dei vent’anni 
le pagine, e nella notte solo
di un geco l’immobile età,
e una candela e posso dire senz’altro
di avere già vissuto, in eterno.

Avevo vent’anni e ne ho avuti cento,
nascosto come un topo, rannicchiato
tra vestiti sparsi, tra libri resti
delle tentate evasioni dal vuoto
che ovunque vada mi rimette al centro
di questa perversa specie di gioco.
Sono come la moglie del soldato
che aspetta un crociato che più non torna.
E Penelope forse questa volta
ha già sigillato il nodo finale. 

Non servirà la spada, né la forza:
il mio nemico è oltre lo specchio
dietro quegli occhi cerchiati, sono io.
Non valgono più, volontà e impegno, 
le regole sono diverse adesso
qui si cerca il tesoro, la formula,
infiniti da dire all’infinito:
aggiungere, riprovare, togliere,
cambiare, combinare, poi sperare.

Ora si ferma il tempo sulla strada:
sono come una lancetta indecisa
che divide quel fiume di persone
che si richiude senza avermi visto.
Ma si sa, un giocattolo di latta
non può mai ricaricarsi da solo.
Ora si ferma il tempo in questa stanza
resto solo resta una penna vuota
sui fogli di una agenda senza note.

Per favore, sui terrazzi di notte 
cercate un geco e la mia candela,
un ragazzo bizzarro, un cappuccio
di un piumino troppo corto, guardate
la manica destra se è rammendata,
ditegli che lo aspetto ancora qui
e che non ho chiuso l’ultimo nodo.