Transformed: exp
[r-squared:r-squared.git] / statistics.cpp
1 /*
2
3     ¬ęCopyright 2014 Eduardo Nacimiento, Andres Nacimiento¬Ľ
4
5     This file is part of R-squared project.
6
7     R-squared project is free software: you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation, either version 3 of the License, or
10     (at your option) any later version.
11
12     R-squared project is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with R-squared project.  If not, see <http://www.gnu.org/licenses/>.
19
20 */
21
22
23 #include "statistics.h"
24
25 // Constructor
26 Statistics::Statistics(MainWindow *w) {
27     w_ = w;
28     dg_ = new DataGrid(w);
29 }
30
31 // Destructor
32 Statistics::~Statistics() {}
33
34 // SUMARY. Create a summary in Editor tab
35 void Statistics::summary(){
36
37     int col_num = dg_->CheckColumn(0);
38     if (col_num == -1) {
39         return;
40     }
41
42     QString col;
43     col.append(QString("%1").arg(col_num + 1));
44
45     w_->resetFile();
46     if (col_num == -2) {
47         w_->R_.parseEval("HTML(z <- summary(mydata), file=\""+QDir::tempPath().toStdString()+"/out.html\")");
48     }
49     else {
50         w_->R_.parseEval("HTML(z <- summary(mydata["+col.toStdString()+"]), file=\""+QDir::tempPath().toStdString()+"/out.html\")");
51     }
52     w_->addHtml("Descriptive statistics");
53
54     w_->tabs_->setCurrentWidget(w_->txtWidget_);
55
56 }
57
58
59 // UNIDIMENSIONAL. Operations with unidimensional variables
60 void Statistics::unidimensional(QString operation) {
61
62     int col_num = dg_->CheckColumn(0);
63     if (col_num == -1) {
64         return;
65     }
66
67     QStringList operationList = operation.split("|");
68     QString col;
69     col.append(QString("%1").arg(col_num + 1));
70
71     w_->resetFile();
72     w_->R_.parseEval("HTML(z <- "+operationList[0].toStdString()+"(mydata[,"+col.toStdString()+"]), file=\""+QDir::tempPath().toStdString()+"/out.html\")");
73     w_->addHtml(operationList[1]);
74     w_->tabs_->setCurrentWidget(w_->txtWidget_);
75
76 }
77
78 // UNIDIMENSIONAL GRAPH. Operations' graph with unidimensional variables
79 void Statistics::unidimensionalGraph(QString operation) {
80
81     int col_num = dg_->CheckColumn(0);
82     if (col_num == -1) {
83         return;
84     }
85
86     QStringList operationList = operation.split("|");
87     QString col;
88     col.append(QString("%1").arg(col_num + 1));
89
90     SEXP ans;
91     ans = w_->R_.parseEval("names(mydata)");
92     Rcpp::CharacterVector names(ans);
93
94
95     QString img_idx = QString::number(std::time(0));
96     QString eval = "png(\""+QDir::tempPath()+"/"+operationList[1]+img_idx+".png\"); ";
97     eval += operationList[0]+"(mydata[,"+col+"], main=\""+names[col.toInt() - 1]+"\", xlab=\""+names[col.toInt() - 1]+"\"); dev.off()";
98
99     w_->resetFile();
100     w_->R_.parseEvalQ(eval.toStdString());
101
102     eval = "HTMLInsertGraph(\""+QDir::tempPath()+"/"+operationList[1]+img_idx+".png\" ,file=\""+QDir::tempPath()+"/out.html\")";
103     w_->R_.parseEvalQ(eval.toStdString());
104     w_->addHtml(operationList[1]);
105     w_->tabs_->setCurrentWidget(w_->txtWidget_);
106
107 }
108
109 // BIDIMENSIONAL. Operations with bidimensional variables
110 void Statistics::bidimensional(QString operation) {
111
112     QList<int> col_num_list = dg_->CheckColumn2();
113     int x = col_num_list.first();
114     if (x == -1) {
115         return;
116     }
117     int y = col_num_list.last();
118
119     QStringList operationList = operation.split("|");
120     QString col_x;
121     QString col_y;
122     col_x.append(QString("%1").arg(x + 1));
123     col_y.append(QString("%1").arg(y + 1));
124
125     w_->resetFile();
126     w_->R_.parseEval("HTML(z <- "+operationList[0].toStdString()+"(mydata[,"+col_x.toStdString()+"],mydata[,"+col_y.toStdString()+"]), file=\""+QDir::tempPath().toStdString()+"/out.html\")");
127
128     w_->addHtml(operationList[1]);
129     w_->tabs_->setCurrentWidget(w_->txtWidget_);
130
131 }
132
133 // BIDIMENSIONAL GRAPH. Operations' graph with bidimensional variables
134 void Statistics::bidimensionalGraph(QString operation) {
135
136     QList<int> col_num_list = dg_->CheckColumn2();
137     int x = col_num_list.first();
138     if (x == -1) {
139         return;
140     }
141     int y = col_num_list.last();
142
143     QStringList operationList = operation.split("|");
144     QString col_x;
145     QString col_y;
146     col_x.append(QString("%1").arg(x + 1));
147     col_y.append(QString("%1").arg(y + 1));
148
149     SEXP ans;
150     ans = w_->R_.parseEval("names(mydata)");
151     Rcpp::CharacterVector names(ans);
152
153
154     QString img_idx = QString::number(std::time(0));
155     QString eval = "png(\""+QDir::tempPath()+"/"+operationList[1]+img_idx+".png\"); ";
156     eval += operationList[0]+"(mydata[,"+ col_x+"],mydata[,"+col_y+"], main=\""+names[col_x.toInt() - 1]+", "+names[col_y.toInt() - 1] +
157             "\", xlab=\""+names[col_x.toInt() - 1]+"\", ylab=\""+names[col_y.toInt() - 1]+"\"); dev.off()";
158
159     w_->resetFile();
160     w_->R_.parseEvalQ(eval.toStdString());
161
162     eval = "HTMLInsertGraph(\""+QDir::tempPath()+"/"+operationList[1]+img_idx+".png\" ,file=\""+QDir::tempPath()+"/out.html\")";
163     w_->R_.parseEvalQ(eval.toStdString());
164     w_->addHtml(operationList[1]);
165     w_->tabs_->setCurrentWidget(w_->txtWidget_);
166
167 }
168
169 // FITTING MODELS. Generate a new lineal model
170 void Statistics::fittingModels(QString operation) {
171
172     QList<int> col_num_list = dg_->CheckColumn2();
173     int x = col_num_list.first();
174     if (x == -1) {
175         return;
176     }
177     int y = col_num_list.last();
178
179     QStringList operationList = operation.split("|");
180     QString col_x;
181     QString col_y;
182     col_x.append(QString("%1").arg(x + 1));
183     col_y.append(QString("%1").arg(y + 1));
184
185     w_->R_.parseEval("z <- "+operationList[0].toStdString()+"(mydata[,"+col_y.toStdString()+"]~mydata[,"+col_x.toStdString()+"])");
186
187     w_->resetFile();
188     w_->R_.parseEvalQ("HTML(summary(z), file=\""+QDir::tempPath().toStdString()+"/out.html\")");
189     w_->addHtml(operationList[1]);
190
191
192     // ANOVA
193     w_->resetFile();
194     w_->R_.parseEvalQ("HTML(anova(z), file=\""+QDir::tempPath().toStdString()+"/out.html\")");
195     w_->addHtml("<br><br>ANOVA");
196
197     QString img_idx = QString::number(std::time(0));
198     QString eval = "png(\""+QDir::tempPath()+"/"+operationList[1]+img_idx+".png\"); par(mfrow=c(2,2));";
199     eval += "plot(z); dev.off()";
200
201     w_->resetFile();
202     w_->R_.parseEvalQ(eval.toStdString());
203
204     eval = "HTMLInsertGraph(\""+QDir::tempPath()+"/"+operationList[1]+img_idx+".png\" ,file=\""+QDir::tempPath()+"/out.html\")";
205     w_->R_.parseEvalQ(eval.toStdString());
206     w_->addHtml(operationList[1]);
207     w_->tabs_->setCurrentWidget(w_->txtWidget_);
208
209 }
210
211
212
213 // Transformed
214 void Statistics::transformed(QString operation) {
215     int col_num = dg_->CheckColumn(1);
216     if (col_num == -1) {
217         return;
218     }
219
220     QString trans;
221
222     if (operation == "Square") {
223         trans = "mydata[,"+QString::number(col_num + 1)+"]^2";
224     }
225     else if (operation == "Square root") {
226         trans = "sqrt(mydata[,"+QString::number(col_num + 1)+"])";
227     }
228     else if (operation == "Natural logarithm") {
229         trans = "log(mydata[,"+QString::number(col_num + 1)+"])";
230     }
231     else if (operation == "Base 10 logarithm") {
232         trans = "log10(mydata[,"+QString::number(col_num + 1)+"])";
233     }
234     else if (operation == "Reciprocal") {
235         trans = "(1/mydata[,"+QString::number(col_num + 1)+"])";
236     }
237     else if (operation == "Reciprocal square root") {
238         trans = "(1/sqrt(mydata[,"+QString::number(col_num + 1)+"]))";
239     }
240     else if (operation == "Exponentiation") {
241         bool ok;
242         QString text = QInputDialog::getText(w_, QObject::tr("Exponent"),
243                                              QObject::tr("n:"), QLineEdit::Normal,
244                                              QString::number(2), &ok);
245         if (ok && !text.isEmpty()) {
246             text.replace(",", ".");
247             trans = "mydata[,"+QString::number(col_num + 1)+"]^"+text;
248         }
249         else {
250             return;
251         }
252     }
253     else {
254         return;
255     }
256
257     SEXP ans;
258     w_->totalCols_++;
259
260
261     ans = w_->R_.parseEval("mydata[,"+QString::number(w_->totalCols_).toStdString()+"] <- with(mydata, "+trans.toStdString()+")");
262
263     Rcpp::DataFrame DF(ans);
264
265     QVector<Rcpp::StringVector> dataVector;
266
267     ans = w_->R_.parseEval("names(mydata)");
268     Rcpp::CharacterVector names(ans);
269
270
271     dataVector.append(DF[0]);
272     w_->listHeader_ << (QString)names[w_->totalCols_ - 1];
273
274     for (int row = 0; row < dataVector[0].size(); row++) {
275         QString data = (QString)dataVector[0][row];
276         data.replace(",", ".");
277         w_->gridMain_->setItem(row, w_->totalCols_ -1, new QTableWidgetItem (data));
278     }
279     w_->gridMain_->setHorizontalHeaderLabels(w_->listHeader_);
280 }