Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2013, 22:02   #1
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию анализ соответствия дискретной выборки нормальному закону распределения

Есть дискретная выборка из 501 элемента (0.4042, 0.5967, 0.2124, 0.4576 и тд...). Провести анализ соответствия этой выборки нормальному закону распределения (распределения Гаусса).

Просмотрел много статей, но везде как то по-разному это описано да и в теор. вер. я слабоват... Кто поможет с алгоритмом решения? Или может у кого то было подобное занание?
s77lanselot77s вне форума Ответить с цитированием
Старый 12.07.2013, 23:00   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Это не тер.вер., это мат.стат.
а) критерий Пирсона (или хи-квадрат) - самый "модный"
Разбиваете весь диапазон (от Xmin до Xmax) на интервалы (для выборки объемом 501 достаточно 10-ти интервалов), считаете частоты попадания в интервалы, считаете теоретические частоты, и по формуле считаете наблюдаемое значение критерия.
б) критерий Колмогорова. Здесь не надо даже разбивать на интервалы.

PS А зачем надо? Если задание по ТВиМС, то обычно указывают, какой критерий испльзовать.
type_Oleg вне форума Ответить с цитированием
Старый 12.07.2013, 23:15   #3
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

задание на практике 2-го курса получил: разработать программу на Qt по приведенному выше заданию (с построением гистограммы, кривой и тд.). С графикой все норм сделал, а вот с мат. стат. беда... Задание придумал руководитель практики и как его выполнить он к сожалению сам мне объяснить не смог...

А можно по поводу частот попадания поподробнее? И по поводу уровня значимости... от чего он должен зависеть?

Последний раз редактировалось s77lanselot77s; 12.07.2013 в 23:18.
s77lanselot77s вне форума Ответить с цитированием
Старый 12.07.2013, 23:46   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Ну, если гистограмму построили, значит эмпирические частоты смогли посчитать.
Теоретические частоты - частоты, которые "должны быть", если бы случайная величина была нормально распределенной. Здесь не обойтись без функции (интегральной) нормального распределения. В Excel такая есть - НОРМРАСП, в VCL для C++ - вроде нет, надо где-то брать, или тупо самому писать подпрограмму численного вычисления интеграла. Я в Delphi использую библиотеку AlgLib.
Уровень значимости обычно задается " проверить гипотезу о виде распределения с уровнем значимости 0,05 (или 0,1 и т.д.)". Если не задан, можно по вычисленному критерию определить достигаемый уровень значимости. Если получился больше 0,05, можно считать , что все ОК.
type_Oleg вне форума Ответить с цитированием
Старый 12.07.2013, 23:55   #5
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

т.е. эмпирические частоты - это количество попаданий в каждый из интервалов, я правильно понимаю?
А после того как я определю все коэффициенты, уровень значимости, теоретические и эмпирические частоты... на основании чего мне делать выводы о том является ли выборка нормально распределенной? Формулы Пирсона?
s77lanselot77s вне форума Ответить с цитированием
Старый 13.07.2013, 00:11   #6
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

В любом случае статистическая гипотеза не доказывается (опровергается) со 100% достоверностью.
Если уровень значимости не задан, то ответом будет, например " гипотеза о нормальном распределении может быть принята с уровнем значимости 0,1289 ".
Число 0,1289 - это вычисленный достижимый уровень значимости.
Если по критерию Пирсона, то оно выисляется через функцию распределения хи-квадрат.
type_Oleg вне форума Ответить с цитированием
Старый 13.07.2013, 00:22   #7
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

а если я например самостоятельно задам уровень значимости, то по функции распределения хи-квадрат я смогу найти на сколько процентов выборка соответств. нормальному закону?

P.S. Извините, может быть я банальные вещи спрашиваю, просто тяжеловато в этом разобраться...
s77lanselot77s вне форума Ответить с цитированием
Старый 13.07.2013, 00:45   #8
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

А вот если задать уровень значимости (самое типичное значение 0,05), то ответом будут :
" гипотеза принимается", или
" гипотеза отвергается".
Безо всяких процентов .Уровень значимости - это и есть вероятность того,что значение критерия может принять то значение, что получилось, или даже большее.
Или по другому, уровень значимости - это вероятность опровергнуть нулевую гипотезу, если нулевая гипотеза на самом деле верна. То есть вероятность "ошибки первого рода".

По поводу уровня значимости могу такой пример привести.
Допустим, некий человек, которого вы считаете честным, утверждает, что он по-честному перетасовал колоду из 36 карт.
Вы снимаете подряд верхние 4 карты , они все оказываются тузами. Ясно, что возникают обоснованные сомнения.
Задаемся уровнем значимости 0,05 (то есть вероятность обвинить в обмане честного человека 0,05).
Вероятность 4-х тузов 0,000017,
Вероятность 3-х тузов 0,0022,
Вероятность 2-х тузов 0,0505.
Следовательно , критическая точка , или максимально допустимое значение критерия, равна 2.
Теоретически, могут и 4 туза совершенно случайно оказаться сверху, но вероятность этого ничтожна, и гораздо меньше заданного уровня значимости.

Последний раз редактировалось Stilet; 13.07.2013 в 10:38.
type_Oleg вне форума Ответить с цитированием
Старый 15.07.2013, 08:21   #9
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

не получается ничего... считаю теоретческие частоты по Лаплассу и получается что теор. частоты с эмпирическими даже близко не стояли, хотя по графику нормальный закон наблюдается


Код:
mainFilter::mainFilter(QWidget* parent, const char* name, WFlags fl)
: Form1(parent,name,fl)
, min( 0 ) 
, max( 0 )
, mat(0) 
, st(0) 
, n( 0 )
, sig(0)
, sigma(0) 
, fx(0) 
, yx(0)
, N(0) 
, t(0) 
{
.......
}

mainFilter::~mainFilter()
{
}

.......

	n = (3.322*(log10(Data.count()))+1); /
	cerr << Data.count() << " "<<  n << endl;

	
	for( DataMap::iterator it = Data.begin(); it != Data.end(); ++it )
	{

		int key = it.key(); 
		double data = it.data(); 

		if( it == Data.begin() )
		{
			min = max = data;
		}
		else
		{
		if (min > data)
			min  = data;
		if (max < data)
			max = data;
		}
		//temp = data;
		mat += data;

		x[ key ] = double( key );
		y[ key ] = data;
	}
	mat /= Data.count();

	st = (max - min)/n;
	
	//cerr << st << endl;
	int a = 1;

	double s, prev = 0;
	s = min;
	for (int i=0; i<n; i++)
	{
		countData[i]=0;
		//st = min + st;
		s = st+s;
//		cerr << "Step: "<< a << " " << s << endl;
		a++;
		stepData[i] = s; // лПФПТЩЕ ЧИПДСФ Ч ЙОФЕТЧБМ
		for (int j = 0; j<Data.count(); j++)
		{
			if (Data[j] > prev && Data[j] < s)
			{

				countData[i]+=1; // лПМЙЮЕУФЧП ЬМЕНЕОФПЧ

			}

		}
		cerr << countData[i]<< " " << stepData[i] << endl;
		prev = s;

	}

	__signal->setData( x, y );
	Plot->replot();
}

void mainFilter::del_clicked()
{
	QMemArray <double> a( 0 );
	QMemArray <double> b( 0 );
	__signal->setData(a, b);
	Plot->replot();
}

void mainFilter::run_clicked()
{
	QString str = "";
	QMemArray <double> count( stepData.count() ); // ьНРЙТЙЮЕУЛЙЕ ЮБУФПФЩ
	QMemArray <double> count_( stepData.count() ); // фЕПТЕФЙЮЕУЛЙЕ ЮБУФПФЩ
	QMemArray <double> step( stepData.count() );


	QMemArray <double> f( Data.count() );
	QMemArray <double> y( Data.count() );

	for( int i  = 0; i< n; i++ )

	{
		
		count[ i ] = countData[i]; 
		step[ i ] = stepData[i];
//		cerr << "count " << count[i] << "step " << step[i] << endl;
		N += countData[i];
	}


	for (int i = 0; i< Data.count(); i++)
	{
		sig = pow(Data[i]-mat, 2);
		sigma += sig;
	}

	sigma/=Data.count();
	sigma=sqrt(sigma);
	cerr << "sigma " << sigma << endl;

	//t =

	for (int i = 0; i< n; i++)
	{
		f[i] = 1/(sigma*sqrt(2*3.14))*pow(2.71828182846,-(pow(step[i]-mat,2))/(2*pow(sigma,2))); //уФТПЙН ЛТЙЧХА
		count_[i] = LaplasFunction(abs((step[i] - mat)/sigma))*st/sigma*N;//((N*st/sigma)*(1/sqrt(2*3.14)*pow(2.71828182846,-(pow(step[i]-mat,2))/2)))
		//y[i] = 1/(sqrt(2*3.14))*pow(2.71828182846,-(pow(step[i]-mat,2))/(2*sigma));
		cerr << count[i] << " | " << count_[i] << " | "  << LaplasFunction((step[i] - mat)/sigma) << " | " << (step[i] - mat)/sigma <<endl;
	}

	
	__signal->setData( step, f );
	__signalPlot->setData(step, f); 
	double p3s,m3s;        
	p3s =  mat + 3*sigma;
	m3s = mat - 3*sigma;
	int counts=0;

	for (int i = 0; i<Data.count(); i++)
	{
		if ((Data[i]>m3s) && (Data[i]<p3s))
		{
			counts++;
		}
	}

	Plot->setAxisTitle( QwtPlot::xBottom,
						QString::fromLocal8Bit("УППФЧЕФУФЧЙЕ ОПТНБМШОПНХ ЪБЛПОХ ТБУРТЕДЕМЕОЙС ОБ %0 %").arg(((double)counts/(double)Data.count())*100.0));
	cerr << "count " << counts << endl;
	cerr << "%= "  << ((double)counts/(double)Data.count())*100.0 << endl;



	this->m->setLabel(QString::fromLatin1 ("M = %0").arg(mat));
	this->m->setXValue(mat);

	this->sig1->setLabel(QString::fromLatin1 ("%0").arg(mat-sigma));
	this->sig1->setXValue(mat - sigma);

	this->sig2->setLabel(QString::fromLatin1 ("%0").arg(mat-2*sigma));
	this->sig2->setXValue(mat - +2*sigma);

	this->sig3->setLabel(QString::fromLatin1 ("%0").arg(mat-3*sigma));
	this->sig3->setXValue(mat - 3*sigma);


	this->sig4->setLabel(QString::fromLatin1 ("%0").arg(mat+sigma));
	this->sig4->setXValue(mat + sigma);

	this->sig5->setLabel(QString::fromLatin1 ("%0").arg(mat+2*sigma));
	this->sig5->setXValue(mat + 2*sigma);

	this->sig6->setLabel(QString::fromLatin1 ("%0").arg(mat+3*sigma));
	this->sig6->setXValue(mat + 3*sigma);


	Plot->replot();
}


const double eps = 0.1e-5;
double mainFilter::func(double x)
{
	return std::exp(-x*x/2);
}
double mainFilter::simpsonIntegr(double a,double b)
{
	return ((b-a) / 6) * (func(a) + 4*func((a+b)/2) + func(b));
}
double mainFilter::LaplasFunction(double x,double eps = 0.1e-5)
{
	double a = 0.0;
	double b = x;
	double tst, tst1, incr;
	unsigned int c = 2;
	tst1 = simpsonIntegr(a,b);
	do {
		tst = tst1;
		tst1 = 0;
		incr = (b - a) / c;
		for (unsigned int i=0;i<c;++i) {
			tst1 = tst1 + simpsonIntegr(a + incr * i, a + incr * (i + 1));
		}
		c += 1;
	} while (fabs(tst - tst1) >= eps);
	return tst1;
}

Последний раз редактировалось s77lanselot77s; 15.07.2013 в 08:49.
s77lanselot77s вне форума Ответить с цитированием
Старый 15.07.2013, 18:51   #10
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Я "цэ-два крестика" не владею.
Но могу посчитать по вашим данным. Перешлите мне свою выборку из 501 числа. Или в .xls, .xlsx - файле, или хотя бы в .txt
Или сами проверьте в Excel, там делов на 10 минут. Есть функции НОРМРАСП, ХИ2РАСП, ХИ2ОБР.
Понятно будет, где именно ошибка.
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сравнить время по-нормальному HellMercenariess Общие вопросы Delphi 2 02.06.2013 10:09
Для выборки определить размах, построить вариационный и статичесткий ряды,полигон,эмпирическую функцию распределения Александримя Паскаль, Turbo Pascal, PascalABC.NET 0 08.04.2013 15:37
проблема с библиотекой Boost при генерации чисел по закону Бетта-распределения Petruha-nsk Общие вопросы C/C++ 2 08.03.2012 10:16
Помогите научиться программировать по нормальному RNT Помощь студентам 7 28.02.2009 13:29
У меня вопрос по нормальному отображению в опере Droid JavaScript, Ajax 3 06.11.2008 18:36